我在学习 're
' Python 的一部分,以及命名模式(?P=name)
使我困惑,
当我使用re.sub()
为了对数字和字符进行一些交换,模式 '(?P=name)
' 不起作用,但模式 '\N
' and '\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
The (?P=name)
is an 内联(模式内)反向引用。您可以在正则表达式模式中使用它来匹配相应命名捕获组捕获的相同内容,请参阅Python 正则表达式语法参考:
(?P=name)
对命名组的反向引用;它匹配先前名为 name 的组所匹配的任何文本。
See 这个演示: (?P<digit>\d{3})-(?P<char>\w{4})&(?P=char)-(?P=digit)
火柴123-abcd&abcd-123
因为“数字”组匹配并捕获123
,“char”组捕获abcd
然后命名的内联反向引用匹配abcd
and 123
.
要替换匹配项,请使用\1
, \g<1>
or \g<char>
语法与re.sub替换模式。不使用(?P=name)
为了这个目的:
repl可以是字符串或函数...反向引用,例如\6
, 被替换为模式中第 6 组匹配的子字符串...
在字符串类型 repl 参数中,除了上述字符转义和反向引用之外,\g<name>
将使用与名为 name 的组匹配的子字符串,如(?P<name>...)
syntax. \g<number>
使用相应的组号;\g<2>
因此相当于\2
,但在替换中并不含糊,例如\g<2>0
. \20
将被解释为对组 20 的引用,而不是对组 2 后跟文字字符“0”的引用。反向引用\g<0>
替换 RE 匹配的整个子字符串。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)