You need to enable JavaScript to run this app. Discord机器人Urban Dictionary指令:嵌入内容违禁词替换仅对列表最后项生效异常排查
优惠活动
大模型
产品
解决方案
定价
更多

Discord机器人Urban Dictionary指令:嵌入内容违禁词替换仅对列表最后项生效异常排查

现存问题
  • 开发调用Urban Dictionary接口的Discord机器人指令时,目标需求为:将接口返回定义内容中的所有指定违禁词统一替换为[NSFW]标记
  • 实际测试发现替换逻辑存在异常:仅能处理违禁词列表最后一位的词条,列表内其余违禁词均无法被正常识别替换
  • 涉及的核心业务代码如下(已隐去包含API密钥的敏感请求头配置):
nsfwdefine = ["swear1", "swear2","swear3"]

# 已隐去包含API密钥的请求头配置
async with ClientSession() as session:
    async with session.get(url, headers=headers, params=querystring) as response:
        r = await response.json()
        embed = discord.Embed(title=f"All result for {term}", description=None,color=0xff0000)
        embed.set_author(name=ctx.author.display_name, url="https://ass.com/", icon_url=ctx.author.avatar_url)
        definition = r['list'][0]['definition']
        embed.add_field(name=term, value=definition, inline=False)
        txt = str(definition)
        for y in nsfwdefine:
          x = re.sub(y, '[NSFW]', txt)
        print(x)

embed2=discord.Embed(title=f"All results for {term}", description=x)
embed2.add_field(name="Info",value=":warning: If your message contains the word [NSFW] then you need to rerun the defintion in a NSFW Channel.")
await ctx.send(embed = embed2)
异常根因
  • 核心错误出在循环替换的文本传值逻辑:原代码每次执行re.sub时,传入的待处理文本始终是初始原始字符串txt,而非上一轮替换完成后的结果
  • 每轮循环都会基于未做任何替换的原始文本生成新的替换结果,前序的替换操作会直接被新结果覆盖。当循环遍历完违禁词列表时,留存的最终结果自然只包含最后一个词的替换效果,其余替换操作全部丢失
可行解决方案

基础修正方案

调整循环内的传值逻辑,每轮替换后将结果作为下一轮的待处理源文本,逐次累积替换效果:

txt = str(definition)
processed_txt = txt  # 初始化待处理文本
for y in nsfwdefine:
    # 每次基于上一轮的处理结果做替换,累积所有替换效果
    processed_txt = re.sub(y, '[NSFW]', processed_txt)
x = processed_txt

优化方案(推荐)

无需逐词循环调用re.sub,可将所有违禁词拼接为单条正则匹配规则,一次性完成全部匹配替换,既减少循环开销,也避免循环传值错误:

import re
nsfwdefine = ["swear1", "swear2","swear3"]
# 构建匹配规则:自动对每个违禁词做正则转义,避免词内包含正则特殊元字符导致匹配失效
# 如需匹配忽略大小写可添加flags=re.IGNORECASE参数
# 如需仅匹配完整单词、避免误替换包含违禁词的正常词汇,可在匹配组两侧加\b单词边界
match_pattern = re.compile('|'.join(re.escape(word) for word in nsfwdefine))

# 替换逻辑
txt = str(definition)
processed_txt = match_pattern.sub('[NSFW]', txt)
优化注意事项
  • 替换逻辑建议增加忽略大小写匹配,避免漏检大小写变体的违禁词
  • 若存在违禁词是其他正常词汇的子串(如违禁词ass出现在assign这类正常单词中),需搭配单词边界匹配,防止误替换正常内容

内容的提问来源于stack exchange,提问作者Death_Blows

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 20:27:04