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

Pyparsing如何实现按以冒号结尾的关键词对解析结果分组

pyparsing keyword分组及嵌套表达式解析方案

原有代码存在两个核心问题:

  1. token规则未排除末尾跟随冒号的字母串,导致后续关键词的前缀会被误识别为普通token
  2. 顶级表达式仅定义了单组keyword+tokens的匹配逻辑,解析完第一组就会停止

以下是完整可运行的实现代码:

import pyparsing as pp
from pprint import pprint

# 定义关键词:字母串 + 冒号
keyword = pp.Combine(pp.Word(pp.alphas) + pp.Literal(":"))
# 定义普通token:仅匹配后面不跟冒号的字母串,避免和关键词冲突
token = pp.Combine(pp.Word(pp.alphas) + ~pp.FollowedBy(":"))

# 递归定义支持&运算和括号嵌套的表达式单元
expr_unit = pp.Forward()
# 括号内内容打包为独立分组
parenthesized = pp.Suppress("(") + pp.Group(pp.OneOrMore(expr_unit)) + pp.Suppress(")")
# 原子项:普通token 或 括号分组
atom = token | parenthesized
# 定义&二元运算规则,左结合
expr_unit <<= pp.infix_notation(
    atom,
    [
        (pp.Literal("&"), 2, pp.OpAssoc.LEFT),
    ]
)

# 单组规则:关键词 + 多个表达式单元,整体打包为分组
group = pp.Group(keyword + pp.OneOrMore(expr_unit))
# 顶级解析规则:匹配多组
parser = pp.OneOrMore(group)

# 测试1:基础分组场景
test1 = "keyA: aaa bb ccc keyB: ddd eee keyC: xxx yyy hhh zzz"
print("测试1结果:")
pprint(parser.parse_string(test1).as_list())

# 测试2:带&和括号嵌套场景
test2 = "keyword1: token11 token12 keyword2: token21 & token22 token23 keyword3: (token31 token32) & token33"
print("\n测试2结果:")
pprint(parser.parse_string(test2).as_list())

运行输出如下:

测试1结果:
[['keyA:', 'aaa', 'bb', 'ccc'],
 ['keyB:', 'ddd', 'eee'],
 ['keyC:', 'xxx', 'yyy', 'hhh', 'zzz']]

测试2结果:
[['keyword1:', 'token11', 'token12'],
 ['keyword2:', ['token21', '&', 'token22'], 'token23'],
 ['keyword3:', [['token31', 'token32'], '&', 'token33']]]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:54:04