Поміркуйте ..
dict = {
'Спорт':'Досуг',
'russianA':'englishA'
}
s = 'Спорт russianA'
Я хотів би замінити всі ключі dict на відповідні значення dict в s.
Поміркуйте ..
dict = {
'Спорт':'Досуг',
'russianA':'englishA'
}
s = 'Спорт russianA'
Я хотів би замінити всі ключі dict на відповідні значення dict в s.
dictйого краще уникати як ім’я змінної, оскільки змінна цього імені затьмарює вбудовану функцію того самого імені.
Відповіді:
Використання 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()))
Зверніть увагу, що в цьому випадку слід сортувати слова за спаданням за довжиною, якщо деякі з ваших словникових статей є підрядками інших.
.join(d.keys())можна замінити на .join(re.escape(key) for key in d.keys()).
https://regex101.com/r/bliVUS/1- Мені потрібно видалити \bв кінці, але не впевнений, що це правильно.
Ви можете використовувати функцію зменшення :
reduce(lambda x, y: x.replace(y, dict[y]), dict, s)
reduceзастосовує заміни одна за одною. Як наслідок, обмін словами за допомогою словників { 'red': 'green', 'green': 'red'}не працює з reduceпідходом на основі, а збіги, що перекриваються, трансформуються непередбачувано.
.replace()дзвінки можуть мати непередбачені наслідки: - html.replace('"', '"').replace('&', '&')спробуйте html = '"foo"'.
Рішення знайдено тут (мені подобається його простота):
def multipleReplace(text, wordDict):
for key in wordDict:
text = text.replace(key, wordDict[key])
return text
в один бік, без ре
d = {
'Спорт':'Досуг',
'russianA':'englishA'
}
s = 'Спорт russianA'.split()
for n,i in enumerate(s):
if i in d:
s[n]=d[i]
print ' '.join(s)
Майже те саме, що 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'
Я використовував це у подібній ситуації (мій рядок був у верхньому регістрі):
def translate(string, wdict):
for key in wdict:
string = string.replace(key, wdict[key].lower())
return string.upper()
сподіваюся, що якимось чином допомагає ... :)
{'cat': 'russiancat'}"гусениця"). Також перекриваються слова ({'car':'russiancar', 'pet' : 'russianpet'}і "килим").