regex 用于捕获软件版本的正则表达式

xmq68pz9  于 2022-12-24  发布在  其他
关注(0)|答案(2)|浏览(166)

我在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中它返回空匹配。有人能解释一下为什么会发生这种情况吗?谢谢!

nwlls2ji

nwlls2ji1#

这部分/i不是Python中区分大小写模式的符号,它应该是一个标志,但是注意,因为你没有匹配任何区分大小写的字符,所以你根本不需要这个标志。
除此之外,您的模式将具有partial matches,而不是完全匹配,正如您在演示链接中看到的那样。
对于给定的示例,您可以从单词边界和数字开始匹配,然后可选地重复所有允许的字符。
如果您希望有多个匹配项,可以使用re.findall返回列表中的所有匹配项,而不是手动循环。

\b\d[\w,.-]*

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

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

Regex demo

2wnc66cl

2wnc66cl2#

有点粗略,好像一个包包含一个数字,输出将是错误的,但除此之外,它对您的示例有效

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

相关问题