Discord Bot文本匹配问题求助:含空格键与精确匹配失效
解决Discord Bot的两个匹配问题
问题1:带空格的键无法匹配
原代码用*message会把命令后的内容按空格拆成多个独立字符串,比如输入!grading abi ayyash会被拆成("abi", "ayyash"),但JSON里的键是完整的"abi ayyash",自然匹配不上。
解决方式:改用*, message: str参数格式,直接获取命令后的全部文本内容,保留空格。
问题2:无法优先匹配长键,出现短键误匹配
原代码逐个检查拆分后的单词,会导致长键被拆分成短单词单独匹配,比如存在"aban test"时,会错误返回"aban"和"test"。
解决方式:
- 先筛选出所有值为
"weak"的键,按长度从长到短排序,确保长键优先被匹配 - 匹配到长键后,从输入文本中移除该键的内容,避免后续匹配到它包含的短键
修改后的完整代码
@commands.command() async def grading(self, ctx, *, message: str): # 筛选所有值为"weak"的键,按长度降序排序(长键优先) weak_keys = [key for key, value in narrators.items() if value == "weak"] weak_keys.sort(key=lambda x: len(x), reverse=True) found_keys = [] remaining_message = message.strip() for key in weak_keys: if key in remaining_message: found_keys.append(key) # 移除已匹配的键内容,防止短键被误匹配 remaining_message = remaining_message.replace(key, "").strip() # 文本为空时提前结束,提升效率 if not remaining_message: break if found_keys: nars = ', '.join(found_keys) await ctx.send(f"This is unreliable because of:\n{nars}") else: await ctx.send("No weak keys found.")
代码说明
*, message: str:确保命令后的所有内容(包括空格)被作为一个完整字符串接收- 按长度降序排序:保证像
"aban b. abi ayyash"这类长键先被匹配,不会被拆成短键误判 - 移除已匹配内容:比如匹配到
"aban test"后,输入文本里的该内容会被删掉,不会再触发"aban"或"test"的匹配 - 增加无匹配的提示:避免空输出,提升用户体验
内容的提问来源于stack exchange,提问作者kararmightbehere
相关产品推荐
相关产品推荐

