Заменить плохое слово на *** в списке
Дано предложение в котором нужно заменить плохие слова на ***, но у меня заменяется только 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 шт):
попробуйте так:
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)
Вариант через регулярное выражение, в качестве бонус регистр текста не нужно менять (за это отвечает флаг 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 *****
Я бы сделал так:
import re
regex = re.compile(r'\b(fuck|bitch)s?', flags=re.IGNORECASE | re.VERBOSE)
result = re.sub(regex, '***', 'Fuck you bitch')
print(result)
В итоге не надо самим заморачиваться по поводу верхнего или нижнего регистра
Добавлю традиционно однострочник. С использованием тернарного 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)