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

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")

解析逻辑说明

  1. 转义还原:先把Discord传递的"替换回普通双引号,确保解析器能识别用户输入的引号。
  2. 正则匹配:用(\w+)=(".*?"|\S+)匹配两种参数格式:
    • 带空格的参数:key="value with spaces"
    • 无空格的参数:key=10或key=singleword
  3. 值处理:自动移除带引号参数的首尾引号,同时尝试将数字类型的参数转为整数(比如strength属性),提升实用性。

其他备选方案

  • 子命令拆分:如果参数类型固定,可以拆分为!setname、!setstrength等子命令,但会增加用户操作步骤,不如单命令灵活。
  • 重写命令解析器:继承commands.Command类重写参数解析逻辑,适合复杂场景,但实现成本较高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:34:51