我的表达方式如下:
^(?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>\\\\?|/?)
