用于获取软件版本的Regex



我正在处理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中返回空匹配。有人能解释一下为什么会这样吗?谢谢!

这部分/i不是Python中不区分大小写模式的符号,它将是一个标志re.I,但请注意,由于您不匹配任何区分大小写的字符,因此根本不需要该标志。

除此之外,你的模式会有部分匹配而不是完全匹配,就像你在演示链接中看到的那样。

对于给定的示例,您可以从单词边界和数字开始匹配,然后可选地重复所有允许的字符。

如果你想有多个匹配项,你可以使用re.findall来返回列表中所有匹配项。

bd[w,.-]*

更具体一点,在数字之间匹配至少一个点,并可选择匹配_.,-中的一个,后跟1+字字符:

bd+(?:.d+)+(?:[_.,-]w+)*

Regex演示

有点粗略,如果一个包包含一个数字,输出将是错误的,但除此之外,它在你的例子中工作

original = ['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']

individual_versions = []
for package in original:
for char_index, char in enumerate(package): 
if char.isdigit():
individual_versions.append(package[char_index:])
break

最新更新