我有这样的表达:
^(?P<stereo1>/?|\\\\?)(?P<bond1>|=?|\.|#?)(?P<number1>[0-9%]*)(?P<branching>[()]*)(?P<stereo2>/?|\\\\?)(?P<bond2>|=?|\.|#?)(?P<number2>[0-9%]*)$
假设我们有一个字符串'\1'
之后:
re.match(regexp, string)
stereo2 = '\'
和 number2=1
。
我的问题是:为什么 stereo1 != '\'
和 'number1' != '1'
?
此外,当我们有字符串“/1”时
re.match(regexp,string)
输出:stereo1 = '/', number1 = '1'
最佳答案
当模式包含交替时,正则表达式引擎会尝试从最左边到最后一个分支查找每个分支的匹配项。这是 NFA 引擎的默认行为。因此,如果与最左边的分支匹配,则不会测试其他分支。
您的具体情况发生了什么?
(?P<stereo1>/?|\\\\?)
第一个分支成功 /?
并匹配空字符串(因为斜杠是可选的),并且第二个分支从未被测试。
何时 (?P<stereo2>/?|\\\\?)
到达时,会发生相同的情况,但是当正则表达式引擎到达结束 anchor $
时,该模式失败。然后正则表达式引擎回溯直到 (?P<stereo2>/?|\\\\?)
并测试成功的第二个分支。
注意:DFA 正则表达式引擎具有不同的行为,它测试每个分支并保留具有较大结果的分支。
因此,如果您想使用 stereo1
捕获反斜杠组,你只需要排列分支:(?P<stereo1>\\\\?|/?)
关于Python正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27469605/