我在for loop
中处理某些软件包的版本,我使用下面的正则表达式只捕获数字,而排除版本的文本部分。
regex = r'[0-9][,-_\.\d]*(,\d+)?/i'
尽管上述正则表达式在regex101.com
上对于以下版本运行良好:
binutils-112.16.91
bison-2.1
bogl-0.1.18-1.4
bogl-0.1.18_1.4
bogl-0.1-18_1.4
5.2
mod_ruby-1.2.4
2.0.0-1.00-r5_i586
bogl-0.1-18_1,4.4
上述版本的预期输出分别为:
112.16.91
2.1
0.1.18-1.4
0.1.18_1.4
0.1-18_1.4
5.2
1.2.4
2.0.0-1.00-r5_i586
0.1-18_1,4.4
但在Python中它返回空匹配。有人能解释一下为什么会发生这种情况吗?谢谢!
2条答案
按热度按时间nwlls2ji1#
这部分
/i
不是Python中区分大小写模式的符号,它应该是一个标志,但是注意,因为你没有匹配任何区分大小写的字符,所以你根本不需要这个标志。除此之外,您的模式将具有partial matches,而不是完全匹配,正如您在演示链接中看到的那样。
对于给定的示例,您可以从单词边界和数字开始匹配,然后可选地重复所有允许的字符。
如果您希望有多个匹配项,可以使用re.findall返回列表中的所有匹配项,而不是手动循环。
更具体一点,匹配数字之间的至少一个点,并可选地匹配
_
.
,
-
之一,后跟1+个单词字符:Regex demo
2wnc66cl2#
有点粗略,好像一个包包含一个数字,输出将是错误的,但除此之外,它对您的示例有效