python re.sub组:\ number之后的数字


183

如何替换foobarfoo123bar

这不起作用:

>>> re.sub(r'(foo)', r'\1123', 'foobar')
'J3bar'

这有效:

>>> re.sub(r'(foo)', r'\1hi', 'foobar')
'foohibar'

我认为,遇到时,这是一个普遍的问题\number。谁能给我一个关于如何处理的提示?


2
该问题已添加到“组”下的“ 堆栈溢出正则表达式常见问题解答 ”中。
aliteralmind 2014年

1
这个问题花了我很长时间,因为它没有“捕获组”或“编号组参考”这两个术语,但我终于来了,很高兴您提出来。
Mark Ch

1
您的问题是r'\ 112'被解释为八进制文字0112,ASCII'J'或十进制74。看不到如何强制执行反向引用'\ 1'在字符串连接或''.join()
smci

与问题有微小偏差,可以通过任何方式引用所有组匹配项,即r'\ <对于所有匹配项> hi'?
Sayan Dey

Answers:


312

答案是:

re.sub(r'(foo)', r'\g<1>123', 'foobar')

相关摘录:

除了如上所述的字符转义和反向引用之外,\ g将使用由(?P ...)语法定义的名为name的组匹配的子字符串。\ g使用​​相应的组号;因此,\ g <2>等效于\ 2,但在诸如\ g <2> 0之类的替换中并没有歧义。\ 20将被解释为对组20的引用,而不是对组2的引用,后跟文字字符“ 0”。反向引用\ g <0>替换RE匹配的整个子字符串。


48
别对自己这么苛刻。它深深地埋藏在文档中,以至于大多数人比阅读Google的问题花更多的时间来阅读文档,并在SO上得到这个答案。
speedplane 2015年

1
如果您正在寻找上下文,可以在此处找到提供的确切报价
patrick

我可以接受小组并进行修改吗?\ g <1> ...例如,在这种情况下,g <1>是foo,但我想用u来更改o,例如“ fuu”
Eric Bellet
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.