gpt4 book ai didi

python - 正则括号 Python 的非捕获版本

转载 作者:太空宇宙 更新时间:2023-11-03 15:42:52 26 4
gpt4 key购买 nike

我的目标是在文本中定位 IP 地址。

使用 grep,我可以用正则表达式 ([0-9]+\.){3}[0-9]+ 来完成。

对于来自 Python 的 re,我不明白为什么它不起作用,除非我在括号内的表达式前面加上 ?:

我知道使用 ?: 会阻止组的创建,但我无法解释删除此前缀后的结果。

>>> s
'64 bytes from 10.11.1.5: icmp_seq=2 ttl=128 time=215 ms'
>>> p=re.compile(r"(?:[0-9]+\.){3}")
>>> p.findall(s)
['10.11.1.']
>>> p=re.compile(r"([0-9]+\.){3}")
>>> p.findall(s)
['1.']

最佳答案

请参阅 re.findall 的文档:

Return all non-overlapping matches of pattern in string, as a list of strings. The string is scanned left-to-right, and matches are returned in the order found. If one or more groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group. Empty matches are included in the result.

强调我的。您的第一个模式中没有捕获组,因此它以字符串形式返回提供的输入中的一个完整匹配项:

['10.11.1.']

但是使用 ([0-9]+\.){3},您确实有一个捕获组,而不是将完整匹配作为字符串返回,它返回一个组列表。记住这一点

A repeated capturing group will only capture the last iteration. Put a capturing group around the repeated group to capture all iterations or use a non-capturing group instead if you're not interested in the data

这就是为什么在结果中只看到组的最后重复,如['1.']。 (不包括完整匹配项,仅包括捕获的组)

关于python - 正则括号 Python 的非捕获版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51602700/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com