Заменить плохое слово на *** в списке

Дано предложение в котором нужно заменить плохие слова на ***, но у меня заменяется только 1 слово, хотя тут их 2. Можете подправить мой код?

txt = 'Fuck you bitch'.lower().split(' ')

bw  = ["fuck", "bitch"]

for j in txt:
    if j in bw:
        temp = [x.replace(j, "***") for x in txt]


res = ' '.join(temp)

print(res)

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

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

попробуйте так:

txt = 'Fuck you bitch'.lower().split(' ')

bw  = ["fuck", "bitch"]

for j in txt:
    if j in bw:
        txt = [x.replace(j, "***") for x in txt]


res = ' '.join(txt)

print(res)
→ Ссылка
Автор решения: gil9red

Вариант через регулярное выражение, в качестве бонус регистр текста не нужно менять (за это отвечает флаг re.IGNORECASE):

import re

txt = 'Fuck you bitch'

bw = ["fuck", "bitch"]
pattern = re.compile('|'.join(bw), flags=re.IGNORECASE)

txt = pattern.sub('***', txt)
print(txt)
# *** you ***

Еще можно сделать так, чтобы количество * соответствовало длине замененного слова:

txt = pattern.sub(lambda m: '*' * len(m.group()), txt)
print(txt)
# **** you *****
→ Ссылка
Автор решения: Zhihar

Я бы сделал так:

import re

regex = re.compile(r'\b(fuck|bitch)s?', flags=re.IGNORECASE | re.VERBOSE)

result = re.sub(regex, '***', 'Fuck you bitch')

print(result)

В итоге не надо самим заморачиваться по поводу верхнего или нижнего регистра

→ Ссылка
Автор решения: CrazyElf

Добавлю традиционно однострочник. С использованием тернарного if и генераторного выражения. А ещё с сохранением исходного регистра слов. И ещё я превратил список недопустимых слов во множество - так проверка на вхождение работает гораздо быстрее в случае если список будет достаточно длинный.

txt = 'Fuck you bitch'.split(' ')
bw  = set(["fuck", "bitch"])
res = ' '.join('***' if word.lower() in bw else word for word in txt)
print(res)
→ Ссылка