如何使用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')
答案 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'