我正在制作一个聊天过滤机器人,人们正在使用下划线、句点和一堆其他符号等符号绕过机器人。有没有人知道一种方法来阻止所有这些脏话?
答案 0 :(得分:2)
最好的方法是使用正则表达式,使用 re
,结合 string
模块中的字符。
这是一个例子:
import re
import string
symbols = string.punctuation + string.digits + string.whitespace
letters = string.ascii_letters
with open("path/to/blacklisted/words.txt") as file:
blacklist = file.read().split('\n')
for word in blacklist:
regex_match_true = re.compile(fr"[{symbols}]*".join(list(word)), re.IGNORECASE)
regex_match_none = re.compile(fr"([{letters}]+{word})|({word}[{letters}]+)", re.IGNORECASE)
if regex_match_true.search(message.content) and regex_match_none.search(message.content) is None:
# Do something here
在这个正则表达式中,创建了一个可选的 symbols
组,并插入到 word
变量的字母之间。这是一个基本布局,可能无法捕获所有列入黑名单的单词,或者可能捕获太多。您可能需要进行大量测试和实验,才能创建符合您需要的正则表达式。
编辑:第二个正则表达式检查正在搜索的坏词是否在坏词本身之前或之后有字母(字母之间没有特殊字符)。
现在出现的问题是,如果单词之间有空格,但末尾有字母,则正则表达式将匹配该模式。例如,如果正在搜索的单词是“word”,并且消息包含短语“two rd.”,则消息将被标记。结果有所改善,但仍然存在问题。