Python中软件版本捕获正则返回空匹配的原因咨询
问题分析与解决
问题原因
- Perl风格修饰符不兼容:Python的
re模块不支持在正则表达式末尾添加/i这种Perl风格的修饰符,这个/i会被当成正则的一部分去匹配目标字符串,但你的版本样本里没有/i内容,直接导致匹配失败。 - 匹配方法使用错误:如果用
re.match()方法,它只会从字符串开头尝试匹配,但你的样本中很多是前缀带文本(比如binutils-112.16.91),开头是字母,自然匹配不到;而测试平台默认是全局查找逻辑,所以能匹配到后面的版本部分。
修正方案
移除无效修饰符:删掉正则末尾的
/i,你的正则里没有涉及字母匹配,本来也不需要不区分大小写的修饰符。修正后的正则:regex = r'[0-9][,-_\.\d]*(,\d+)?'使用正确的匹配方法:用
re.search()代替re.match(),它会在整个字符串中查找第一个符合规则的匹配项。示例代码:import re samples = [ "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" ] regex = r'[0-9][,-_\.\d]*(,\d+)?' for s in samples: match = re.search(regex, s) if match: print(match.group())优化正则(可选):原正则里
[0-9]和\d重复,可简化为等价的更简洁写法:regex = r'\d[,\d_\.-]*'
测试结果
运行修正后的代码,输出与预期完全一致:
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
内容的提问来源于stack exchange,提问作者PHV
相关产品推荐
相关产品推荐

