discord.py中含双引号的字符串传递问题求助
解决Discord.py命令中带空格参数的引号解析问题
核心问题原因
你遇到的UnexpectedQuoteError是因为Discord会将消息中的双引号转义为HTML实体",而discord.py默认的命令参数解析器无法识别这种转义后的引号,同时默认解析逻辑对带空格的参数处理不够灵活。
简易解决办法:自定义参数解析
直接绕过默认的参数解析逻辑,自己实现一套键值对解析逻辑,同时处理HTML转义的引号,用户无需额外转义操作,直接按!set name="名称" story="多词背景"格式输入即可。
实现代码
import re from discord.ext import commands bot = commands.Bot(command_prefix="!") @bot.command() async def set(ctx, *, raw_args): # 先将Discord转义的引号还原为普通双引号 args = raw_args.replace('"', '"') # 正则匹配 key="带空格的值" 或 key=无空格的值 的格式 param_pattern = re.compile(r'(\w+)=(".*?"|\S+)') params = {} for key, value in param_pattern.findall(args): # 移除带引号值的首尾双引号 if value.startswith('"') and value.endswith('"'): params[key.strip()] = value[1:-1].strip() else: # 处理数字类型(比如strength=10) try: params[key.strip()] = int(value) except ValueError: params[key.strip()] = value.strip() # 这里添加你的角色数据保存逻辑 await ctx.send(f"角色属性已更新:\n{chr(10).join([f`{k}: {v}` for k, v in params.items()])}") # 替换为你的Bot Token bot.run("YOUR_BOT_TOKEN")
解析逻辑说明
- 转义还原:先把Discord传递的
"替换回普通双引号,确保解析器能识别用户输入的引号。 - 正则匹配:用
(\w+)=(".*?"|\S+)匹配两种参数格式:- 带空格的参数:
key="value with spaces" - 无空格的参数:
key=10或key=singleword
- 带空格的参数:
- 值处理:自动移除带引号参数的首尾引号,同时尝试将数字类型的参数转为整数(比如strength属性),提升实用性。
其他备选方案
- 子命令拆分:如果参数类型固定,可以拆分为
!setname、!setstrength等子命令,但会增加用户操作步骤,不如单命令灵活。 - 重写命令解析器:继承
commands.Command类重写参数解析逻辑,适合复杂场景,但实现成本较高。
内容的提问来源于stack exchange,提问作者Automatycs
相关产品推荐
相关产品推荐

