Фильтр плохих слов на python
Я сделал "фильтр плохих слов", но не могу сделать 1 вещь. Например, если в тексте есть бл# и сабля, то код заменит бл# на #%#, а сабля на са#%#. Честно, я уже сломал голову и не знаю как это исправить. (Наверняка есть решение с индексами, но у меня не получилось). Помогите, пожалуйста!
import random
chars = ["*","#","%","&","?","@"]
bw = ["fuck", "bitch"]
txt = 'Fuck you fucker bitch'.lower().split(' ')
for word in txt:
if word in bw:
temp = random.sample(chars, len(word))
i = ''.join(temp)
txt = [x.replace(word, i) for x in txt]
res = ' '.join(txt)
print(res)
- Вход: Fuck you fucker bitch
- Вывод: @&?* you @&?er ?%@&
Ответы (1 шт):
Специально для решения таких задач существуют регулярные выражения. Разумеется, любой фильтр можно обойти, поэтому как именно вы составите регулярку, определяется только вашей фантазией.
Например, в интернете я нашёл вот такое прекрасное регулярное выражение, которое не только решает вашу задачу, но и находит многие другие нецензурные слова:
(\s+|^)[пПnрРp]?[3ЗзВBвПnпрРpPАaAаОoO0о]?[сСcCиИuUОoO0оАaAаыЫуУyтТT]?[Ппn][иИuUeEеЕ][зЗ3][ДдDd]\w*[\?\,\.\;\-]*|(\s+|^)[рРpPпПn]?[рРpPоОoO0аАaAзЗ3]?[оОoO0иИuUаАaAcCсСзЗ3тТTуУy]?[XxХх][уУy][йЙеЕeEeяЯ9юЮ]\w*[\?\,\.\;\-]*|(\s+|^)[бпПnБ6][лЛ][яЯ9]([дтДТDT]\w*)?[\?\,\.\;\-]*|(\s+|^)(([зЗоОoO03]?[аАaAтТT]?[ъЪ]?)|(\w+[оОOo0еЕeE]))?[еЕeEиИuUёЁ][бБ6пП]([аАaAиИuUуУy]\w*)?[\?\,\.\;\-]*
Вот конкретно для слова "Бля":
(\s+|^)([бБ6][лЛ][яЯ9])
(\s+|^)
- здесь мы смотрим, чтобы сначала было либо начало строки ^
, либо один или более символ пробела \s+
.
([бБ6][лЛ][яЯ9])
- тут мы определяем слово, подразумевая, что оно состоит из трёх букв. Для каждой буквы в квадратных скобках мы задаём диапазон возможных значений. Таким образом следующие слова тоже попадут под фильтр:
6ля (цифра 6 вместо буквы)
бЛя
бл9