Как заменить только полное слово в строке?

Мне нужно заменить некоторые слова в предложениях, но дело в том, что 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 шт):

Автор решения: MaxU

Воспользуйтесь регулярными выражениями:

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']
→ Ссылка
Автор решения: CrazyElf

В принципе, это можно это сделать и без регулярных выражений минимальным изменением вашего кода:

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, они ведь специально и были придуманы для парсинга текстовой информации.

→ Ссылка