我该如何将foobar
替换为foo123bar
?
以下方法无法实现:
>>> re.sub(r'(foo)', r'\1123', 'foobar')
'J3bar'
这是可行的:>>> re.sub(r'(foo)', r'\1hi', 'foobar')
'foohibar'
我认为当使用像\number
这样的东西时,这是一个常见的问题。有人能给我提示如何处理吗?
我该如何将foobar
替换为foo123bar
?
以下方法无法实现:
>>> re.sub(r'(foo)', r'\1123', 'foobar')
'J3bar'
这是可行的:>>> re.sub(r'(foo)', r'\1hi', 'foobar')
'foohibar'
我认为当使用像\number
这样的东西时,这是一个常见的问题。有人能给我提示如何处理吗?
答案是:
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 匹配的子字符串。
(?P<q>['"])(.*)(?P=q)
,其中(?P=q)
引用了命名组(?P<q>['"])
。例如,如果第一个字符是单引号,则最后一个组只会匹配单引号。 - Fred Dufresne