我的表达方式如下:
^(?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'
答案 0 :(得分:3)
当模式包含替换时,正则表达式引擎会尝试从最左边到最后一个分支找到与每个分支的匹配。这是NFA引擎的默认行为。因此,如果与最左边的分支匹配,则不测试其他分支。
您的具体情况会发生什么?
(?P<stereo1>/?|\\\\?)
使用其第一个分支/?
成功并匹配空字符串(因为斜杠是可选的),并且永远不会测试第二个分支。
当达到(?P<stereo2>/?|\\\\?)
时,会发生相同的情况,但当正则表达式引擎到达结束锚$
时,模式会失败。然后正则表达式引擎回溯到(?P<stereo2>/?|\\\\?)
并测试成功的第二个分支。
注意:DFA正则表达式引擎具有不同的行为,它会测试每个分支并保留具有更大结果的分支。
因此,如果您想要使用stereo1
组捕获反斜杠,则只需要对分支进行置换:(?P<stereo1>\\\\?|/?)