在Python正则表达式中,我遇到了这个奇异的问题。
你能说明一下re.findall('(ab|cd)', string)
和re.findall('(ab|cd)+', string)
之间的区别吗
import re
string = 'abcdla'
result = re.findall('(ab|cd)', string)
result2 = re.findall('(ab|cd)+', string)
print(result)
print(result2)
实际产出为:
['ab', 'cd']
['cd']
我不明白为什么第二个结果也不包含'ab'
所以,让我困惑的是
docs
所以它返回给你的不是一个完整的匹配,而是一个捕获的匹配。如果您使该组不捕获
(re.findall('(?:ab|cd)+', string)
,它将返回我最初期望的["abcd"]
我不知道这是否会让事情变得更清楚,但让我们试着用一种简单的方式想象一下引擎盖下会发生什么, 我们将使用match来了解发生了什么
findall
同时匹配并使用字符串让我们想象一下这个正则表达式会发生什么'(ab|cd)'
:现在
'(ab|cd)+'
也是这样我希望这件事能澄清一点
+
是匹配一次或多次的重复量词。在regex(ab|cd)+
中,您使用+重复捕获组(ab|cd)
。这将只捕获最后一次迭代您可以对这种行为进行如下推理:
假设您的字符串是
abcdla
,正则表达式是(ab|cd)+
。正则表达式引擎将在位置0和位置1之间找到组的匹配项作为ab
,并退出捕获组。然后它看到+
量词,因此再次尝试捕获组,并将捕获位置2和3之间的cd
如果要捕获所有迭代,则应使用与
abcd
和cd
匹配的((ab|cd)+)
来捕获重复组。您可以使内部组不被捕获,因为我们不关心与((?:ab|cd)+)
匹配的内部组匹配abcd
https://www.regular-expressions.info/captureall.html
从文件来看
相关问题 更多 >
编程相关推荐