对于编写正则表达式模式、原子组的初学者[重复]

问题描述 投票:0回答:1

我理解原子组不会回溯的事实,并且我正在尝试示例来更多地理解这个主题,但我对其行为感到困惑,我希望有人可以向我解释它。预先感谢。

如果我使用模式

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,我期待着“不匹配”

python regex atomic
1个回答
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'。这样,小组赛就“锁定”了比赛。只是现在回溯不再可能了。

© www.soinside.com 2019 - 2024. All rights reserved.