Как заменить только полное слово в строке?
Мне нужно заменить некоторые слова в предложениях, но дело в том, что replace заменяет все вхождения одного слова в другое. Допустим, здесь в:
dirty = ['actor and daughters', 'farm tractor is moving']
, мне нужно заменить слово 'actor' на 'person', но моя функция в этом случае превратит 'tractor' в 'trperson'.
Как можно избежать этого?
def repl(dirty, bad_word, good_word):
replace_list = []
for capt in dirty:
if bad_word in capt:
new_capt = capt.replace(bad_word, good_word)
replace_list.append(new_capt)
else:
replace_list.append(capt)
return replace_list
Ответы (2 шт):
Воспользуйтесь регулярными выражениями:
import re
res = [re.sub(r"\bactor\b", "person", x) for x in dirty]
PS "\b" - в терминах RegEx обозначает word boundary (граница слова)
результат:
In [9]: res
Out[9]: ['person and daughters', 'farm tractor is moving']
В принципе, это можно это сделать и без регулярных выражений минимальным изменением вашего кода:
if bad_word in capt.split(): # добавил .split()
На выходе:
['person and daughters', 'farm tractor is moving']
Хотя это не всегда будет работать правильно, надо будет ещё код менять (если в предложении будет и actor и tractor одновременно, результат будет неправильный), но идея, думаю, понятна - надо разбивать предложение на слова и работать уже со словами.
Вот такой вариант будет точно работать правильно (если слова разделены пробелами):
def repl(dirty, bad_word, good_word):
return [' '.join([good_word if word == bad_word else word for word in capt.split(' ')]) for capt in dirty]
Если слова могут быть всё же разделены разными символами, то лучше и проще использовать регулярные выражения как указал в ответе MaxU, они ведь специально и были придуманы для парсинга текстовой информации.