如何只替换使用python re.findall而不是整个字符串找到的元素?

时间:2015-08-18 11:01:32

标签: python regex

如何使用python regex findall方法替换找到的组,而不必更改字符串的其余部分。

例如:

import re
repl1='k1'
repl2='k2'
pattern=re.compile('CN=Root,Model=.*,Vector=Reactions\[(.*)\],ParameterGroup=Parameters,Parameter=(.*),Reference=Value')

我想使用re.sub仅用(.*) repl1替换repl1中的元素,而不是必须更改字符串的其余部分。

-------编辑-----

我想要的输出应该如下所示:

output = 'CN=Root,Model=.*,Vector=Reactions[k1],ParameterGroup=Parameters,Parameter=k2,Reference=Value')

但请注意,我已将'.*'留在model之后,因为每次都会改变。即这可以是任何东西。

----------编辑2 ----------

输入是简单的一行,在pattern几乎完全相同。例如:

input= 'CN=Root,Model=Model1,Vector=Reactions\[k10],ParameterGroup=Parameters,Parameter=k12,Reference=Value')

1 个答案:

答案 0 :(得分:3)

re.sub的参数repl可以是单参数函数,在这种情况下,它是以匹配对象作为参数调用的。因此,如果您确保模式的所有部分都在一个组中,那么您应该拥有将旧字符串替换为新字符串所需的所有信息。

import re

repl1='k1'
repl2='k2'
pattern=re.compile('(CN=Root,Model=.*,Vector=Reactions\[)(.*)(\],ParameterGroup=Parameters,Parameter=)(.*)(,Reference=Value)')
target = 'CN=Root,Model=something,Vector=Reactions[somethingelse],ParameterGroup=Parameters,Parameter=1234,Reference=Value'

现在定义一个函数,该函数生成匹配的字符串,其中第1组和第3组替换为所需的值:

def repl(m):
    g = list(m.groups())
    g[1] = repl1
    g[3] = repl2
    return "".join(g)

将此函数作为re.sub的第一个参数传递,而不是实现所需的转换:

pattern.sub(repl, target)

给出结果

'CN=Root,Model=something,Vector=Reactions[k1],ParameterGroup=Parameters,Parameter=k2,Reference=Value'