@RockyMotion

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

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

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

for i in text.split(' '):
        i.lower()
        word = dict.get(i)
        if word!=None:
            text = text.replace(i,word)
  • Вопрос задан
  • 493 просмотра
Решения вопроса 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: Система юзает, код пользователь
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы