我有一个试图匹配版本号的正则表达式,但是它产生了很多误报。
(\d{1,3}).*?(\d{1,3}).*?(\d{1,3})
到目前为止,这是我所拥有的,这与具有 3 个部分和 2 个点的任何内容相匹配。
1.2.333
11.2.3
但是它不匹配具有 2 个部分和 1 个点的东西,
1.2
它也过于贪婪,所以一条线包含多个点和部分,例如 11.22.33 。 44.55.66.77 会匹配两次。
我正在寻找一个涵盖所有场景的正则表达式,
1.2
1.2.3
并且只匹配 1.2.3.4.5.6.7.8
编辑:
我认为 ^\d{1,3}(?:\.\d{1,3})(?:\.\d{1,3})?
将尽可能接近我目前想要的大部分内容
它仍然没有挑选出一长串列表的前 3 部分,我会继续尝试
答案 0 :(得分:1)
你想要的正则表达式是:
(\d{1,3}(?:\.\d{1,3}){1,2})(?:\.\d{1,3})*
包含最后的子表达式 (?:\.\d{1,3})*
以消耗输入的其余部分,否则如果不包含此子表达式,则在 findall
扫描恢复时会导致匹配,如 1.2.3 1.2.3.4.5.6.7.8
的情况{1}}。
import re
s = 'abc 1.2 1.2.3 1.2.3.4.5.6.7.8'
print(re.findall(r'(\d{1,3}(?:\.\d{1,3}){1,2})(?:\.\d{1,3})*', s))
打印:
['1.2', '1.2.3', '1.2.3']
或者,您可以使用否定回顾:
((?<!\.)\d{1,3}(?:\.\d{1,3}){1,2})
import re
s = 'abc 1.2 1.2.3 1.2.3.4.5.6.7.8'
print(re.findall(r'((?<!\.)\d{1,3}(?:\.\d{1,3}){1,2})', s))
打印:
['1.2', '1.2.3', '1.2.3']
如果您使用 search
而不是 findall
,匹配将作为组 1 返回。