Python正则表达式即时替换组。

184
有没有一种直接使用正则表达式语法替换所有分组的方法?
正常的方式:
re.match(r"(?:aaa)(_bbb)", string1).group(1)

但我希望能够实现类似于这样的效果:

re.match(r"(\d.*?)\s(\d.*?)", "(CALL_GROUP_1) (CALL_GROUP_2)")

我希望能立即从正则表达式捕获的组中构建新字符串。

2个回答

314

看一下re.sub

result = re.sub(r"(\d.*?)\s(\d.*?)", r"\1 \2", string1)

这是Python的正则表达式替换(replace)函数。替换字符串可以填充所谓的反向引用(反斜杠,组号),它们将被匹配的组替换。 组的计数方式与group(...)函数相同,即从左到右,从1开始,通过括号打开。


7
比文档清晰多了!之前不太理解这个群组是如何运作的。他们应该加入这样的例子。 - tupui
2
@RakshithaMurangaRodrigo 这些组从左到右编号,按它们的起始位置排序。因此,如果我在每个组的前面插入组号,它们将被排序为:1(r2(r))r3(4(r)5(6(r)r)) - Martin Ender
6
使用这种记法,您还可以为一个组提供名称:(?P<group-name><pattern>),然后以这种方式引用它们:\g<group-name>。在我看来,这是最方便的方法。 - Playing With BI
但是 string1 是什么?我的意思是你在哪里放置替换值? - Phil
1
@MarshallJobe 在 * 后面加上 ? 并不意味着可选,而是使 * 变成非贪婪模式。话虽如此,在这种情况下仍然是不必要的(甚至可能是个坏主意),但我只是重用了问题中精确的正则表达式,因为重点在于替换。 - Martin Ender
显示剩余4条评论

77

被采纳的答案非常完美。我会补充说,使用这种语法可能更好地实现组引用:

r"\g<1> \g<2>"

用于替换字符串。这样,您就可以解决语法限制的问题,其中一个组可能会后跟数字。再次强调,这都在文档中提到了,没有新内容,只是有时很难一眼看出来。


2
如果您想在一组数字后添加一个数字,这是正确的方法,否则,它会将数字值与组序数搞混。 - xpeiro

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