如何同时替换多个子串

How to replace multiple substrings at the same time

我有一个像

这样的字符串
a = "X1+X2*X3*X1"
b = {"X1":"XX0","X2":"XX1","X0":"XX2"}

我想用字典 b 替换子字符串 'X1,X2,X3'。

但是,当我使用下面的代码替换时,

for x in b:
    a = a.replace(x,b[x])
print(a)

'XXX2+XX1*X3'

预期结果是 XX0 + XX1*X3*XX0

我知道是循环替换了子串,但是不知道怎么解决

可以使用re.subrepl参数:

import re
re.sub('X\d', lambda x: b.get(x.group(), x.group()), a)

输出:

'XX0+XX1*X3*XX0'

您可以使用 '|' 创建一个模式,然后在字典转换中搜索,如下所示。

试试这个:

import re
a = "X1+X2*X3*X1"
b = {"X1":"XX0","X2":"XX1","X0":"XX2"}

pattern = re.compile("|".join(b.keys()))
out = pattern.sub(lambda x: b[re.escape(x.group(0))], a)

输出:

>>> out
'XX0+XX1*X3*XX0'

这是因为您要多次替换同一个字符串,所以在幕后(或迭代之间)中间还有一些您可能看不到的开关(除非调试它代码)。 请注意字典键没有排序,所以你不能假设什么时候被替换了。 我建议你使用 template

只有内置函数。给定的 b 字典包含键和值之间的循环,因此使用 f-string 符号来执行替换。要转义 {} 应该将它们加倍 {{}},用于重复替换。需要 enumerate 才能在新字典中获取唯一键,因此不再需要循环。

a = "X1+X2*X3*X1"
b = {"X1":"XX0","X2":"XX1","X0":"XX2"}

new_dict = {}
for i, k in enumerate(b):
    sub_format =  f'{k}' + f'{i}'
    new_dict[sub_format] = b[k]
    a = a.replace(k, f'{{{sub_format}}}')

print(a.format(**new_dict))

输出

XX0+XX1*X3*XX0