如何检测句子任意位置是否包含预设单词列表中的指定敏感词?
问题原因
你当前的实现存在两个核心问题:
- 直接将
filter_words.txt的全部内容读取为单个大字符串,判断逻辑为「整段消息是否存在于这个大字符串中」,自然只能匹配完全等于某一违禁词的消息 - 使用了Python内置关键字
list作为变量名,会覆盖内置的列表方法,存在隐藏风险
修复方案
首先调整违禁词加载逻辑:提前将违禁词从文件中按规则拆分、清洗后存储为列表,不要每次收到消息都重读文件,减少不必要的IO开销。之后将匹配逻辑改为「只要消息内容中存在任意一个违禁词就触发删除」即可。
示例代码
首先在bot初始化阶段一次性加载违禁词:
def load_filter_words(file_path: str = "filter_words.txt") -> list: filter_words = [] with open(file_path, 'r', encoding='utf-8') as f: # 如果你的违禁词是每行存一个,用下方逻辑 for line in f: # 去除每行首尾的换行符、空白符,转小写后过滤空行 word = line.strip().lower() if word: filter_words.append(word) # 如果你的违禁词是用英文逗号分隔存储,把上面的循环替换为下方代码即可 # content = f.read().lower() # for word in content.split(','): # word = word.strip().strip("'\"{} ") # if word: # filter_words.append(word) return filter_words # 全局存储预加载的违禁词列表 FILTER_WORDS = load_filter_words()
消息触发逻辑修改为:
msg = message.content.lower() # 遍历匹配任意违禁词 for word in FILTER_WORDS: if word in msg: await message.delete() await message.channel.send(f"{message.author.mention} 的消息因包含违禁内容被删除") # 命中后直接跳出循环,无需继续遍历 break
可选优化(提升匹配效率)
如果违禁词数量较多,可以预编译正则表达式提升匹配速度:
import re # 初始化时预编译正则规则,忽略大小写 FILTER_REGEX = re.compile( '|'.join(re.escape(word) for word in FILTER_WORDS), re.IGNORECASE ) # 消息判断逻辑简化为 if FILTER_REGEX.search(message.content): await message.delete() await message.channel.send(f"{message.author.mention} 的消息因包含违禁内容被删除")
内容的提问来源于stack exchange,提问作者FunkySplash48
相关产品推荐
相关产品推荐

