¿La forma más fácil de reemplazar una cadena usando un diccionario de reemplazos?

Considerar..

dict = { 'Спорт':'Досуг', 'russianA':'englishA' } s = 'Спорт russianA' 

Me gustaría reemplazar todas las claves dict con sus respectivos valores de dictado en s .

Utilizando re:

 import re s = 'Спорт not russianA' d = { 'Спорт':'Досуг', 'russianA':'englishA' } pattern = re.compile(r'\b(' + '|'.join(d.keys()) + r')\b') result = pattern.sub(lambda x: d[x.group()], s) # Output: 'Досуг not englishA' 

Esto solo coincidirá con palabras completas. Si no necesitas eso, usa el patrón:

 pattern = re.compile('|'.join(d.keys())) 

Tenga en cuenta que, en este caso, debe ordenar las palabras que descienden por longitud si algunas de las entradas de su diccionario son subcadenas de otras.

Podrías usar la función de reducción :

 reduce(lambda x, y: x.replace(y, dict[y]), dict, s) 

Solución encontrada aquí (me gusta su simplicidad):

 def multipleReplace(text, wordDict): for key in wordDict: text = text.replace(key, wordDict[key]) return text 

de una manera, sin re

 d = { 'Спорт':'Досуг', 'russianA':'englishA' } s = 'Спорт russianA'.split() for n,i in enumerate(s): if i in d: s[n]=d[i] print ' '.join(s) 

Casi lo mismo que ghostdog74, aunque creado de forma independiente. Una diferencia, usar d.get () en lugar de d [] puede manejar elementos que no están en el dict.

 >>> d = {'a':'b', 'c':'d'} >>> s = "acx" >>> foo = s.split() >>> ret = [] >>> for item in foo: ... ret.append(d.get(item,item)) # Try to get from dict, otherwise keep value ... >>> " ".join(ret) 'bdx' 

Usé esto en una situación similar (mi cadena estaba en mayúsculas):

 def translate(string, wdict): for key in wdict: string = string.replace(key, wdict[key].lower()) return string.upper() 

Espero que eso ayude de algún modo… 🙂

Con la advertencia de que falla si la clave tiene espacio, esta es una solución comprimida similar a ghostdog74 y extaneons responde:

 d = { 'Спорт':'Досуг', 'russianA':'englishA' } s = 'Спорт russianA' ' '.join(d.get(i,i) for i in s.split())