@RockyMotion

Как сделать, чтобы Python заменял только по точному совпадению?

Есть входящий текст, далее код по словарю проверяет, есть ли совпадения, если есть заменят слово. Беда в том, что по словарю он должен заменить "юзер" на "пользователь", но система подхватывает все слова, включая "юзеров", "юзеры" и т.д.

Использую такой код:
text = "Система использует код юзеров"
dict = { 'юзер' : 'пользователь'}

for i in text.split(' '):
        i.lower()
        word = dict.get(i)
        if word!=None:
            text = text.replace(i,word)
  • Вопрос задан
  • 115 просмотров
Решения вопроса 1
изначальный вариант

text = "Система использует код юзер"
dict = { 'юзер' : 'пользователь'}

words = text.split(' ')
for i,word in enumerate(words):
    replacement = dict.get(word.lower(), None)
    if replacement is not None:
        words[i] = replacement

text = ' '.join(words)
print(text)


UPD: как верно замечено в комментарии, код выше не будет правильно работать с возможными знаками препинания в предложении.
Ниже альтернативное рещение с применением регулярок.
import re

text = "Система использует код юзер"
dict = { 'юзер' : 'пользователь'}

def replace_func(match):
  word = match.group(1)
  return dict.get(word.lower(), word)

text = re.sub(r'(\w+)', replace_func, text)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
Как вариант:

import re

text1 = "Система используется код юзеров"
text2 = "Система использует, код юзер"
re_list = [
    ('юзер', 'пользователь'), 
    ('использует', 'юзает')
]

for example in [text1, text2]:
    out = example
    for patt_in, patt_out in re_list:
        out = re.sub(
            '(\s+|,|\.|^)'+patt_in+'(\s|,|\.|$)', 
            '\g<1>'+patt_out+'\g<2>', 
            out
        )
        
    print(f'Before: {example}')
    print(f'After: {out}\n')



Before: Система используется код юзеров
After: Система используется код юзеров

Before: Система использует код юзер
After: Система юзает, код пользователь
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
ZClick Москва
от 50 000 до 200 000 руб.
Protoplan Краснодар
от 80 000 до 150 000 руб.