下面是代码:
import re
a = "111234567890"
b = re.finditer(r"((?<=\d)\d{3})+", a)
print("finditer: ")
print(b)
for item in b:
print(item.group(), end='\n\n')
c = re.findall(r"((?<=\d)\d{3})+", a)
print("findall: ")
print(c, end='\n\n')
d = re.search(r"((?<=\d)\d{3})+", a)
print("search: ")
如上图,我在 python3 doc 中搜索,发现 findall 和 finditer 应该都类似于 search 在任何地方检查匹配,而不像 match 只是在开头搜索。因此,我使用这三个进行比较,并运行代码以获得以下结果:
finditer:
<callable_iterator object at 0x000002712064F948>
112345678
findall:
['678']
search:
<re.Match object; span=(1, 10), match='112345678'>
那么我的问题是:
如果我的正面后向断言没有 "+",它更改为r"((?<=\d)\d{3})",那么为了匹配这个断言,结果应该是 1 位后视,再加上 3 位数字。于是:</p>
re.search result should be:123
re.findall result should be:['112', '345', '678']
re.rearch result should be: ['112', '345', '678']
但是正如我上面显示的代码,我在 r"((?<=\d)\d{3})" 之后添加了 '+',断言变为r"((?<=\d)\d{3}) +",表示结果应该匹配这个(1digt+3digit后面)的情况1次或更长时间,然后结果应该结合[112,345,678],如上图所示:
re.search get the result like'112345678'.
Also re.finditer get the same result as shown above.
However, re.findall get different result as ['678'] shown above.
谁能帮我解释一下为什么断言后面加上'+'会使re.findall与re.search和re.finditer得到不同的结果?
非常感谢