命名反向引用 (?P=name)问题在Python re



我正在学习Python的re'部分,命名模式(?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

为什么当我使用(?P=name)时它无法替代?
以及如何正确使用它?
我正在使用Python 3.5

>(?P=name)内联(模式内)反向引用。您可以在正则表达式模式中使用它来匹配相应命名捕获组捕获的内容,请参阅 Python正则表达式语法参考:


(?P=name)对命名组的反向引用;它匹配与前面名为 name 的组匹配的任何文本。

请参阅此演示:(?P<digit>d{3})-(?P<char>w{4})&(?P=char)-(?P=digit)匹配123-abcd&abcd-123因为"数字"组匹配并捕获123,"char"组捕获abcd,然后命名的内联反向引用匹配abcd123

要替换匹配项,请使用1g<1>g<char>语法re.sub替换模式。请勿将(?P=name)用于此目的:

repl可以是字符串或函数...反向引用,例如6,将替换为模式中由组 6 匹配的子字符串...

在字符串类型的 repl 参数中,除了上述字符转义和反向引用外,g<name>还将使用与名为 name 的组匹配的子字符串,如(?P<name>...)语法所定义的那样。g<number>使用相应的组号; 因此g<2>等价于2,但在g<2>0等替换中并不模棱两可。20将被解释为对组 20 的引用,而不是对组 2 的引用,后跟文字字符"0"。反向引用g<0>替换与 RE 匹配的整个子字符串。

您可以检查使用和反向引用的详细信息吗?P访问:

https://docs.python.org/3/library/re.html

并在浏览器中使用 CTRL+F 查找 (?P...)。它带有一个很好的图表,其中包含有关何时可以使用的所有说明?P=名称。

对于此示例,您在第三次 re.sub() 调用时做对了。

在所有 re.sub() 调用中,您只能使用 ?此方法的第一个字符串参数中的 P=name 语法,第二个字符串参数中不需要它,因为您有 \g 语法。

如果您对 ?P=name 很有用,但它是通过反向引用已经命名的字符串来进行匹配的。

示例:您要匹配马铃薯XXX马铃薯并将其替换为YYXXXYY。您可以制作:

re.sub(r'(?P<myName>potato)(XXX)(?P=myName)', r'YY2YY', 'potatoXXXpotato')

re.sub(r'(?P<myName>potato)(?P<triple>XXX)(?P=myName)', r'YYg<triple>YY', 'potatoXXXpotato')

最新更新