我尝试使用正则表达式来查找由重复的双字母组成的最大长度序列,例如字符串xAAABBBBy
中的AABB
。
如official documentation中所述:'*'
、'+'
和'?'
量词都是贪婪的;它们匹配尽可能多的文本。
当我使用量词{n,}
时,我得到一个完整的子串,但+
只返回部分:
import re
print(re.findall("((AA|BB){3,})", "xAAABBBBy"))
# [('AABBBB', 'BB')]
print(re.findall("((AA|BB)+)", "xAAABBBBy"))
# [('AA', 'AA'), ('BBBB', 'BB')]
为什么{n,}
比+
更贪婪?
1条答案
按热度按时间5kgi1eie1#
量词
{3,}
和+
都是贪婪的。首先,让我们通过将内部组更改为非捕获组来简化输出:
第一个模式需要重复次数≥3,因此唯一可能的匹配从第二个
A
开始:x
A
✅**A
A
B
B
B
B
**ⅹy
第二种模式只需要重数≥1。当从左到右扫描字符串时,第一个(最左边)可能的贪婪匹配由前两个
A
s组成。对于剩余的字符串ABBBBy
,第一个(最左边)可能的贪婪匹配是BBBB
。之后,只剩下y
,它不能被匹配。B
B
B
B
y