为什么python正则表达式(?P = name)不起作用

时间:2017-09-03 07:19:14

标签: python regex python-3.x

我正在学习' re' Python的一部分,命名模式(?P=name)让我困惑,

当我使用re.sub()进行数字和字符的交换时,模式&#39; (?P=name)&#39;不起作用,但模式&#39; \N&#39;和&#39; \g<name>&#39;仍然有意义。代码如下:

[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

2 个答案:

答案 0 :(得分:4)

multikeysort内联(模式内)反向引用。您可以在正则表达式模式中使用它来匹配相应的命名捕获组捕获的相同内容,请参阅Python Regular Expression Syntax reference

  

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

请参阅this demo(?P=name)匹配(?P<digit>\d{3})-(?P<char>\w{4})&(?P=char)-(?P=digit),因为&#34;数字&#34;小组匹配并捕获123-abcd&abcd-123,&#34; char&#34;组捕获123,然后命名的内联反向引用匹配abcdabcd

要替换匹配项,请使用123\1\g<1>语法和re.sub替换模式。请勿将\g<char>用于此目的:

  

repl 可以是字符串或函数......反向引用(例如(?P=name))将替换为模式中第6组匹配的子字符串...

在字符串型repl参数中,除了上面描述的字符转义和反向引用之外, \6将使用由\g<name>定义的名为name的组匹配的子字符串。语法即可。 (?P<name>...)使用相应的组号;因此,\g<number>相当于\g<2>,但在\2等替换中并不含糊。 \g<2>0将被解释为对第20组的引用,而不是对第2组的引用,后跟字面字符&#39; 0&#39;。反向引用\20替换为RE匹配的整个子字符串。

答案 1 :(得分:2)

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

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

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

对于这个例子,你在第三次re.sub()调用时做得很好。

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

如果您对?P =名称有用感到困惑,那就是,但是通过反向引用已经命名的字符串进行匹配。

示例:您想要匹配potatoXXXpotato并将其替换为YYXXXYY。你可以做:

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

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