我发现在Python 3.7.0中,当一个分支最初匹配但使用或运算符捕获组时会出现奇怪的行为,但是正则表达式最终必须回溯并使用另一个分支。在这种情况下,即使正则表达式使用第二个分支,捕获组仍会保留在第一个分支中。
示例代码:
regexString = "^(a)|(ab)$"
captureString = "ab"
match = re.match(regexString, captureString)
print(match.groups())
Run Code Online (Sandbox Code Playgroud)
输出:
('a', None)
Run Code Online (Sandbox Code Playgroud)
第二组是使用的组,但是第一组被捕获,而第二组没有被捕获。
有趣的是,我发现了一种解决方法,可以在两个组之间添加非捕获括号,如下所示:
regexString = "^(?:(a)|(ab))$"
Run Code Online (Sandbox Code Playgroud)
新输出:
(None, 'ab')
Run Code Online (Sandbox Code Playgroud)
在我看来,这种行为似乎是一个错误。如果不是这样,有人可以向我指出一些说明为什么发生这种情况的文档吗?谢谢!
这是一个常见的正则表达式错误。这是您的原始模式:
^(a)|(ab)$
Run Code Online (Sandbox Code Playgroud)
这实际上是说match ^a,即a在输入的开头或 ab$,即ab在输入的结尾。如果您想匹配a或ab作为整个输入,那么您发现需要:
^(?:(a)|(ab))$
Run Code Online (Sandbox Code Playgroud)
为了进一步使自己相信这种行为,可以验证以下模式与原始模式是否匹配:
(ab)$|^(a)
Run Code Online (Sandbox Code Playgroud)
即,交替的每个术语是分开的,并且位置甚至不重要,至少关于哪个输入将匹配或不匹配。顺便说一句,您可以使用以下模式:
^ab?$
Run Code Online (Sandbox Code Playgroud)
这将匹配a或ab,并且您甚至不需要捕获组,因为整个匹配将与您想要的匹配。