KE *_* LI 4 python regex backreference python-3.x python-re
我正在学习rePython 的“ ”部分,命名模式(?P=name)让我感到困惑,
当我用来re.sub()进行数字和字符的交换时,模式“ (?P=name)”不起作用,但模式“ \N”和“ \g<name>”仍然有意义。代码如下:
[IN]print(re.sub(r'(?P<digit>\d{3})-(?P<char>\w{4})', r'(?P=char)-(?P=digit)', '123-abcd'))
[OUT] (?P=char)-(?P=digit)
[IN] print(re.sub(r'(?P<digit>\d{3})-(?P<char>\w{4})', r'\2-\1', '123-abcd'))
[OUT] abcd-123
[IN] print(re.sub(r'(?P<digit>\d{3})-(?P<char>\w{4})', r'\g<char>-\g<digit>', '123-abcd'))
[OUT] abcd-123
Run Code Online (Sandbox Code Playgroud)
为什么我使用时无法进行替代(?P=name)?
以及如何正确使用呢?
我正在使用Python 3.5
这(?P=name)是一个内联(模式内)反向引用。您可以在正则表达式模式中使用它来匹配相应命名捕获组捕获的相同内容,请参阅Python正则表达式语法参考:
\n\n\n\n
(?P=name)
\n 对命名组的反向引用;它匹配先前名为 name 的组所匹配的任何文本。
请参阅此演示:(?P<digit>\\d{3})-(?P<char>\\w{4})&(?P=char)-(?P=digit)匹配123-abcd&abcd-123是因为“digit”组匹配并捕获123,“char”组捕获abcd然后命名的内联反向引用匹配abcd和123。
要替换匹配项,请使用\\1,\\g<1>或\\g<char>带有re.sub替换模式的语法。请勿用于(?P=name)此目的:
\n\nrepl可以是字符串或函数...反向引用,例如
\n\\6,会替换为模式中第 6 组匹配的子字符串...
在字符串类型的 repl 参数中,除了上面描述的字符转义和反向引用之外,\\g<name>还将使用与名为 name 的组匹配的子字符串,如(?P<name>...)语法所定义。\\g<number>使用相应的组号;\\g<2>因此等价于\\2,但在诸如 之类的替换中,\xe2\x80\x99t 是不明确的\\g<2>0。\\20将被解释为对组 20 的引用,而不是对组 2 的引用,后跟文字字符“0”。反向\\g<0>引用替换 RE 匹配的整个子字符串。