regex 为什么正则表达式量词{n,}比+(在Python中)更贪婪?

bmvo0sr5  于 2023-03-31  发布在  Python
关注(0)|答案(1)|浏览(98)

我尝试使用正则表达式来查找由重复的双字母组成的最大长度序列,例如字符串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,}+更贪婪?

5kgi1eie

5kgi1eie1#

量词{3,}+都是贪婪的。
首先,让我们通过将内部组更改为非捕获组来简化输出:

import re

print(re.findall("((?:AA|BB){3,})", "xAAABBBBy"))
# ['AABBBB']
print(re.findall("((?:AA|BB)+)", "xAAABBBBy"))
# ['AA', 'BBBB']

第一个模式需要重复次数≥3,因此唯一可能的匹配从第二个A开始:
xA ✅**AABBBB**ⅹ y
第二种模式只需要重数≥1。当从左到右扫描字符串时,第一个(最左边)可能的贪婪匹配由前两个A s组成。对于剩余的字符串ABBBBy,第一个(最左边)可能的贪婪匹配是BBBB。之后,只剩下y,它不能被匹配。
BBBBy

相关问题