python正则表达式-findall没有按预期返回输出

时间:2021-03-16 12:49:00

标签: python 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.

为什么这个基本的 IP 正则表达式不能按预期与 findall 一起使用?匹配项不重叠,regexpal 确认该模式在 re_str 中突出显示。

enter image description here

预期:['1.2.2.3', '123.345.34.3']

实际:['2.', '34.']

re_str = r'(\d{1,3}\.){3}\d{1,3}'
line = 'blahblah -- 1.2.2.3 blah 123.345.34.3'
matches = re.findall(re_str, line)
print(matches)    # ['2.', '34.']

2 个答案:

答案 0 :(得分:1)

这是因为捕获组在重复时仅返回最后一个匹配项。

相反,您应该将重复组设为非捕获,并在外层使用非重复捕获:

re_str = r'((?:\d{1,3}\.){3}\d{1,3})'

请注意,对于 findall,如果没有捕获组,则会自动选择整个匹配项(如 \0),因此您可以删除外部捕获:

re_str = r'(?:\d{1,3}\.){3}\d{1,3}'

答案 1 :(得分:1)

当您在正则表达式中使用括号时,re.findall() 将仅返回括号内的组,而不是整个匹配的字符串。在 ?: 后面加一个 ( 告诉它不要使用括号提取一个组,那么结果应该是整个匹配的字符串。