Pyparsing如何实现按以冒号结尾的关键词对解析结果分组
pyparsing keyword分组及嵌套表达式解析方案
原有代码存在两个核心问题:
token规则未排除末尾跟随冒号的字母串,导致后续关键词的前缀会被误识别为普通token- 顶级表达式仅定义了单组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
相关产品推荐
相关产品推荐

