0

下面是代码:


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得到不同的结果?

非常感谢

4

0 回答 0