正则表达式 - 在第一次与版本号匹配后停止

时间:2021-01-14 16:21:46

标签: python regex greedy

我有一个试图匹配版本号的正则表达式,但是它产生了很多误报。

(\d{1,3}).*?(\d{1,3}).*?(\d{1,3})

到目前为止,这是我所拥有的,这与具有 3 个部分和 2 个点的任何内容相匹配。 1.2.333 11.2.3

但是它不匹配具有 2 个部分和 1 个点的东西, 1.2

它也过于贪婪,所以一条线包含多个点和部分,例如 11.22.3344.55.66.77 会匹配两次。

我正在寻找一个涵盖所有场景的正则表达式,

1.2 1.2.3 并且只匹配 1.2.3.4.5.6.7.8

的第一个实例

Pythex checker

编辑: 我认为 ^\d{1,3}(?:\.\d{1,3})(?:\.\d{1,3})? 将尽可能接近我目前想要的大部分内容 它仍然没有挑选出一长串列表的前 3 部分,我会继续尝试

1 个答案:

答案 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}}。

See Regex Demo

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})

See Regex Demo

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 返回。