我理解原子组不会回溯的事实,并且我正在尝试示例来更多地理解这个主题,但我对其行为感到困惑,我希望有人可以向我解释它。预先感谢。
如果我使用模式
r'(?>[abocv]+[cv])'
作为示例文本'abooaabcvvbbb'
我会得到匹配!如何?如果原子组不回溯最后一个字母应该是“bb”...这是否意味着原子组正在检查“cv”是否是“abocv”的子集(这是“abocv”的第一部分)图案)?
pattern = r'(?>[abocv]+[cv])'
text = 'abooaabcvvbbb'
match = re.match(pattern, text)
if match:
print(match.start())
else:
print('no match')
我得到了 0,我期待着“不匹配”
我认为您正在期待以下行为:
import re
pattern2= r'^(?>[abocv]+)[cv]'
text = 'abooaabcvvbbb'
match = re.match(pattern2, text)
if match:
print(match.start())
else:
print('no match')
哪里
(?>[abocv]+)
与您预期的 'abooaabcvv' 匹配,并且由于它是原子的,因此不会放开它。[cv]
然后无法匹配“bbb”中的第一个“b”在你的正则表达式中:
(?>[abocv]+[cv])
[...]+
最初匹配'abooaabcv',但可以回溯到[...]+
,放开最后一个'v'来匹配'abooaabcv',然后[cv]
可以匹配'v'。这样,小组赛就“锁定”了比赛。只是现在回溯不再可能了。