Замена с помощью re.sub ()

Нужно ввести массив значений в pattern из re.sub(pattern, repl, string) не знаю, как это можно реализовать пробовал вот так:

from re import sub
def filter_words(phrase):
   for word in "bad|mean|ugly|horrible|hideous".split("|"):
       if word in phrase.lower():
           return sub(word,"awesome",phrase)

Пример работы кода: мы вводим строку "You said he was a bad dog." ---> "You said he was a awesome dog."

И аналогичная замена происходит со всеми словами из этой строки "bad|mean|ugly|horrible|hideous".


Ответы (1 шт):

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

В регулярных выражения для поиска целых слов, их нужно оборачивать в \b.

В PATTERN_TEXT будет такой шаблон:

\bbad\b|\bmean\b|\bugly\b|\bhorrible\b|\bhideous\b

Пример:

import re

WORDS = "bad", "mean", "ugly", "horrible", "hideous"
PATTERN_TEXT = '|'.join(fr"\b{word}\b" for word in WORDS)
PATTERN = re.compile(PATTERN_TEXT, flags=re.IGNORECASE)


def filter_words(phrase):
    return PATTERN.sub("awesome", phrase)


print(filter_words("You said he was a bad dog."))
# You said he was a awesome dog.

print(filter_words("You said he was a badass dog."))
# You said he was a badass dog.

Если нужно без полного совпадения по слову, то нужно убрать \b:

import re

WORDS = "bad", "mean", "ugly", "horrible", "hideous"
PATTERN = re.compile('|'.join(WORDS), flags=re.IGNORECASE)


def filter_words(phrase):
    return PATTERN.sub("awesome", phrase)


print(filter_words("You said he was a bad dog."))
# You said he was a awesome dog.

print(filter_words("Go on Tony you, horribleish person!"))
# Go on Tony you, awesomeish person!
→ Ссылка