Python“智能”正则表达式替换基于它自己的匹配?

时间:2015-11-02 14:20:46

标签: python regex

我想进行“智能”正则表达式替换。例如,考虑:

import re
str = "x(x) and y(y)"
res = re.sub("\(.*?\)","z", str)

结果是:

xz and yz

所以基本上当正则表达式"\(.*?\)"找到匹配m时,匹配被替换为"z"。但是,我想将匹配m替换为其自身的一些功能:f(m)

import re
str = "x(x) and y(y)"
res = re.sub("\(.*?\)",lambda m: m[:-1] + ", z" + m[-1], str)

应该产生:

x(x, z) and y(y, z)

有没有python /优雅的方法来做到这一点?

1 个答案:

答案 0 :(得分:4)

您可以捕获匹配并:

res = re.sub("\((.*?)\)", "(\g<1>, z)",  str)

\g<1>包含匹配的组(在这种情况下,它是等式中括号内的内容)。

>>> str = "x(x) and y(y)"
>>> res = re.sub("\((.*?)\)", "(\g<1>, z)",  str)
>>> res
'x(x, z) and y(y, z)'

我建议您避免使用在Python中有意义的变量名,例如strlist ..用户s例如用于字符串。功能

Backreferences

让我们来看看以下正则表达式:

(\d+)([a-z]+)

正则表达式匹配一个或多个数字,后跟一个或多个字符&#34; a-z&#34;。给定字符串&#34; 1234helloWorld&#34;,第一组(\1)匹配数字,第二组匹配[a-z]字符。