Самый простой способ заменить строку с помощью словаря замен? - PullRequest
69 голосов
/ 08 марта 2010

Рассмотрим ..

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

s = 'Спорт russianA'

Я хотел бы заменить все ключи dict соответствующими значениями в s.

Ответы [ 7 ]

89 голосов
/ 08 марта 2010

Использование 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'

Это будет соответствовать только целым словам. Если вам это не нужно, используйте шаблон:

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

Обратите внимание, что в этом случае вам следует отсортировать слова по убыванию, если некоторые из ваших словарных статей являются подстроками других.

22 голосов
/ 08 марта 2010

Вы можете использовать функцию уменьшить :

reduce(lambda x, y: x.replace(y, dict[y]), dict, s)
17 голосов
/ 08 марта 2010

Решение найдено здесь (мне нравится его простота):

def multipleReplace(text, wordDict):
    for key in wordDict:
        text = text.replace(key, wordDict[key])
    return text
5 голосов
/ 08 марта 2010

в одну сторону, без повторного

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

s = 'Спорт russianA'.split()
for n,i in enumerate(s):
    if i in d:
        s[n]=d[i]
print ' '.join(s)
3 голосов
/ 08 марта 2010

Почти так же, как ghostdog74, хотя и создан независимо. Одно отличие, использование d.get () вместо d [] может обрабатывать элементы, не указанные в диктанте.

>>> d = {'a':'b', 'c':'d'}
>>> s = "a c x"
>>> foo = s.split()
>>> ret = []
>>> for item in foo:
...   ret.append(d.get(item,item)) # Try to get from dict, otherwise keep value
... 
>>> " ".join(ret)
'b d x'
1 голос
/ 21 ноября 2017

С предупреждением о сбое, если у ключа есть место, это сжатое решение, похожее на ghostdog74, и ответы extaneons:

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

s = 'Спорт russianA'

' '.join(d.get(i,i) for i in s.split())
1 голос
/ 11 сентября 2013

Я использовал это в аналогичной ситуации (моя строка была в верхнем регистре):

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

надеюсь, что это как-то поможет ...:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...