在Python的re.sub()函数中,有没有一种方法可以在替换字符串中使用正则表达式?

6
在Python的re模块中有以下函数:

re.sub(pattern, repl, string, count=0, flags=0) - 返回通过用替换字符串repl替换string中最左边的非重叠出现的pattern而获得的字符串。如果未找到该pattern,则返回未更改的string。

我已发现它可以像这样工作:
print re.sub('[a-z]*\d+','lion','zebra432') # prints 'lion'

我想知道,在替换字符串中是否有一种简单的方法可以使用正则表达式,使得替换字符串包含原始正则表达式/原始字符串的一部分?具体来说,我能否做到像这样(它不起作用)?

print re.sub('[a-z]*\d+', 'lion\d+', 'zebra432')

我想打印'lion432',但实际上打印的是'lion\d+'。是否有一种简单的方法在替换字符串中使用匹配正则表达式的某些部分呢?
顺便说一下,这不是一个特例。请不要假设数字总是出现在末尾,单词总是出现在开头等。我想知道所有正则表达式的解决方案。
谢谢。
1个回答

12

\d+放入捕获组(...)中,然后使用\1来引用它:

>>> import re
>>> re.sub('[a-z]*(\d+)', r'lion\1', 'zebra432')
'lion432'
>>>
>>> # You can also refer to more than one capture group
>>> re.sub('([a-z]*)(\d+)', r'\1lion\2', 'zebra432')
'zebralion432'
>>>

来自docs:

回溯引用,例如 \6,将被替换为模式中匹配的第 6 组的子字符串。

请注意,您还需要使用raw-string,以便\1不被视为转义序列。


正则表达式(第一个字符串)是否也应该使用原始字符串? - David Zwicker
@DavidZwicker - 可能吧。但在这里并不是绝对必要的。 - user2555451
1
斑马狮大概是我最喜欢的动物了。 - roippi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接