如何解决正则表达式 - 在第一次与版本号匹配后停止
我有一个试图匹配版本号的正则表达式,但是它产生了很多误报。
(\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 部分,我会继续尝试
解决方法
你想要的正则表达式是:
(\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})*',s))
打印:
['1.2','1.2.3','1.2.3']
或者,您可以使用否定回顾:
((?<!\.)\d{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,2})','1.2.3']
如果您使用 search
而不是 findall
,匹配将作为组 1 返回。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。