You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测句子任意位置是否包含预设单词列表中的指定敏感词?

问题原因

你当前的实现存在两个核心问题:

  1. 直接将filter_words.txt的全部内容读取为单个大字符串,判断逻辑为「整段消息是否存在于这个大字符串中」,自然只能匹配完全等于某一违禁词的消息
  2. 使用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 08:39:05