Задать вопрос
@RockyMotion

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

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

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

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

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

Похожие вопросы
SpectrumData Екатеринбург
от 150 000 до 250 000 ₽
Wanted. Москва
До 250 000 ₽
AST Москва
До 350 000 ₽
14 янв. 2025, в 12:26
10000 руб./за проект
14 янв. 2025, в 12:25
8500 руб./за проект
14 янв. 2025, в 12:24
6500 руб./за проект