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

Pyparsing语法解析失败咨询:为何无法正确解析指定字符串?

问题原因

原代码里的token_any = pp.Word(pp.printables)会把结尾的*也匹配进去,因为pp.printables包含了*字符。当解析*asd*时:

  • 第一个Literal("*")匹配开头的*
  • token_any会贪婪匹配所有后续的可打印字符,也就是asd*
  • 此时字符串已被匹配完,后面的Literal("*")找不到匹配项,因此报错

Pyparsing的Word是匹配连续的符合字符集的字符,不会自动回溯去预留结尾的*,这和正则\*.*\*的行为不同——正则引擎会在匹配到末尾后回溯找到最后一个*,但Word一旦匹配就不会拆分已匹配的内容。

修复方案

有两种常见的修复方式:

方式一:修改字符集,排除*

把token_any的字符集改成不包含*的可打印字符:

import pyparsing as pp

token_any = pp.Word(pp.printables.replace('*', ''))
comment = pp.Literal("*") + token_any("comment text") + "*"

res = comment.parse_string("""*asd*""")
print(res.dump())

方式二:使用正则表达式匹配

直接用pp.Regex实现精准匹配,或者替换原token_any:

import pyparsing as pp

# 替换token_any的写法
token_any = pp.Regex(r'[^*]+')
comment = pp.Literal("*") + token_any("comment text") + "*"

res = comment.parse_string("""*asd*""")
print(res.dump())

运行修复后的代码,就能正确解析出comment text: 'asd'。

内容的提问来源于stack exchange,提问作者The Bic Pen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:04:58