在Python的re.sub()中,可以在替换字符串中使用正则表达式吗?

6 投票
1 回答
3582 浏览
提问于 2025-04-18 14:28

在Python的re模块中,有一个这样的函数:

re.sub(pattern, repl, string, count=0, flags=0) – 这个函数会返回一个新字符串,它是通过把字符串中最左边不重叠的符合模式的部分替换成指定的替换内容来得到的。如果找不到符合模式的部分,原字符串就会保持不变。

我发现它可以这样使用:

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'
>>>

来自 文档

\6 这样的反向引用,会被模式中第 6 组匹配到的子字符串替换。

注意,你还需要使用 原始字符串,这样 \1 就不会被当作转义序列处理。

撰写回答