如何同时替换多个子串
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.sub
的repl
参数:
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
我有一个像
这样的字符串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.sub
的repl
参数:
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