Замена подстроки значением словаря, если она совпадает с ключами

#python-3.x #string #dictionary

#python-3.x #строка #словарь

Вопрос:

У меня также есть словарь и строка, я хочу заменить подстроку значением словаря. Я использую следующий код, но не получаю ожидаемого результата.

 dict1 = {'name1': 'Orange', 'name2': 'Apple', 'name3': 'Carrot', 'name4': 'Mango'}
a ="Fruit: name1    Fruit: name2    Fruit: name5    Fruit: name3    Fruit: name5"
print(a)
a_new = ''
for key in dict1.keys():
    skey = a[a.find(': ')   2 : a.find(' F')].strip()
    if skey == key:
        sval = dict1[key]
        a_new = a[ : a.find(': ')   1]   sval   a[a.find(' F') : ]
print(a_new)
  

Вывод моего кода

 Fruit: name1     Fruit: name2     Fruit: name5     Fruit: name4     Fruit: name5 
Fruit:Orange Fruit: name2     Fruit: name5     Fruit: name4     Fruit: name5
  

Мой ожидаемый результат

 Fruit: name1     Fruit: name2     Fruit: name5     Fruit: name4     Fruit: name5 
Fruit: Orange     Fruit: Apple     Fruit: name5     Fruit: Carrot     Fruit: Mango
  

Я ценю вашу помощь. Заранее спасибо.

Комментарии:

1. Вы хотите сопоставить подстроки с последовательными ключами от первого до последнего или хотите проверить, совпадает ли оно с какими-либо ключами?

2. Я просто хочу проверить, совпадает ли подстрока с ключами словаря или нет.

Ответ №1:

Ну, вы были очень близки к ожидаемому результату. Я где-то отредактировал ваши коды и получил ожидаемый результат, хотя вы также можете сделать это с помощью регулярного выражения. find возвращает совпадения первого вхождения с подстрокой, в вашем случае вам нужно сместить find позицию поиска.

 find(substring, start_position, end_position)
  

Измененный код

 dict1 = {'name1': 'Orange', 'name2': 'Apple', 'name3': 'Carrot', 'name4': 'Mango'}
a ="Fruit: name1    Fruit: name2     Fruit: name5    Fruit: name3    Fruit: name5"
offset1 = 0
offset2 = 0
print(a)
for key in dict1.keys():
    skey = a[a.find(': ', offset1)   2 : a.find(' F', offset2)].strip()
    if skey in dict1.keys():
        sval = dict1[key]
        a = a[ : a.find(': ', offset1)   2]  sval   't'   a[a.find(' F', offset2) : ]
    offset1 = a.find(': ', offset1)   1
    offset2 = a.find(" F", offset2)   1
print(a)
  

Вывод

 Fruit: name1    Fruit: name2     Fruit: name5    Fruit: name3    Fruit: name5
Fruit: Orange    Fruit: Apple    Fruit: name5    Fruit: Mango    Fruit: name5
  

Ответ №2:

Вы можете использовать регулярное выражение для поиска совпадений и использовать его для замены совпадающих слов в строке.

 import re

dict1 = {'name1': 'Orange', 'name2': 'Apple', 'name3': 'Carrot', 'name4': 'Mango'}
a ="Fruit: name1 
    Fruit: name2 
    Fruit: name5 
    Fruit: name4 
    Fruit: name5 
"
pattern = re.compile(r"w :s (w )")
match = re.findall(pattern, a)
for item in match:
    if item in dict1.keys():
        a = a.replace(item, dict1[item])
print(a)
  

Вывод:

 'Fruit: Orange     Fruit: Apple     Fruit: name5     Fruit: Mango     Fruit: name5 '