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

Pyparsing如何校验末尾无后续表达式的AND/OR关键字语法合法性

问题原因

你当前定义的解析规则默认只匹配输入字符串的前缀,只要开头部分符合one_expr + 零或多个(AND/OR + one_expr)的结构,后续未匹配的内容会被直接忽略,因此末尾多余的AND/OR不会触发错误。

解决方法

有两种常用的修改方案,都可以实现「要求输入内容完全符合规则,不允许存在多余后缀」的校验效果:

方案1:给解析规则添加字符串结束锚点

在unpack_expr的定义末尾追加pp.StringEnd(),强制要求整个输入字符串必须全部匹配规则,没有剩余内容:

# 原定义:unpack_expr = one_expr + pp.ZeroOrMore(AND_OR + one_expr)
# 修改后:
unpack_expr = one_expr + pp.ZeroOrMore(AND_OR + one_expr) + pp.StringEnd()

方案2:调用解析方法时添加全匹配参数

调用parseString时传入parseAll=True,作用和添加StringEnd()完全一致:

print(unpack_expr.parseString("a = 10 and b = 2 or", parseAll=True))

两种方案任选其一即可,修改后测试非法输入a = 10 and b = 2 or时,会抛出如下格式的解析错误:

pyparsing.exceptions.ParseException: Expected end of text, found 'or' (at char 17), (line:1, col:18)

额外优化建议

为了避免字段名中包含AND/OR子串时被误识别为逻辑关键字(例如字段名land会被误拆出and关键字),建议修改AND_OR的定义,添加关键字边界校验:

# 原定义:AND_OR = pp.oneOf("AND OR", True)
# 修改后:
AND_OR = pp.oneOf(["AND", "OR"], caseless=True, asKeyword=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 12:15:04