tengo una cadena como
a = "X1+X2*X3*X1" b = {"X1":"XX0","X2":"XX1","X0":"XX2"}Quiero reemplazar la subcadena 'X1,X2,X3' usando dict b.
Sin embargo, cuando reemplazo usando el siguiente código,
for x in b: a = a.replace(x,b[x]) print(a)'XXX2+XX1*X3'
El resultado esperado es XX0 + XX1*X3*XX0
Sé que es porque la subcadena se reemplaza en un bucle, pero no sé cómo resolverlo.
Puede usar el parámetro repl de re.sub :
import re re.sub('X\d', lambda x: b.get(x.group(), x.group()), a)producción:
'XX0+XX1*X3*XX0'Puede crear un patrón con '|' luego busque en la transformación del diccionario como se muestra a continuación.
Prueba esto:
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)Producción:
>>> out 'XX0+XX1*X3*XX0'La razón de esto es porque está reemplazando la misma cadena varias veces, por lo que detrás de escena (o entre las iteraciones) hay algunos interruptores más en el medio que probablemente no vea (a menos que esté depurando este código). Tenga en cuenta que las claves del diccionario no están ordenadas, por lo que no puede asumir qué se reemplaza y cuándo. Te sugiero que uses la plantilla
Con solo funciones integradas. El diccionario b dado contiene ciclos entre claves y valores, por lo que usó la notación f-string para realizar las sustituciones. Para escapar de {} uno debe duplicarlos {{}} , usado para sustitución repetida. La enumerate es necesaria para obtener claves únicas en el nuevo diccionario, así que no más ciclos.
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))Producción
XX0+XX1*X3*XX0