如何用Python解析嵌套条件表达式字符串并转换为结构化数据?
解析嵌套条件表达式为结构化数据
问题背景
需要处理嵌套深度不可预测的条件表达式字符串,例如:
str1 = "('a' AND ('b' OR 'c')) OR ('d' AND ('e' OR ('g' AND 'h')))"
目标是将其转换为保留嵌套逻辑关系的结构化数据(字典/列表),方便后续转换为JSON或YAML格式。此前尝试按括号拆分生成嵌套列表,但无法正确解析AND/OR的逻辑关系,需要调整实现方式。
解决方案:使用pyparsing解析语法结构
pyparsing专门用于解析自定义语法,能准确识别嵌套逻辑表达式中的运算符与操作数,生成符合需求的结构化数据。
步骤1:定义语法规则
通过pyparsing的组件定义表达式的语法:
- 原子变量:匹配带单引号的变量,并自动去除引号
- 逻辑运算符:匹配
AND/OR关键字 - 递归表达式:支持嵌套的括号分组,并用中缀表达式处理运算符优先级
完整代码示例
from pyparsing import ( QuotedString, Keyword, Forward, Suppress, infixNotation, opAssoc ) import yaml # 1. 定义原子变量(匹配带单引号的内容,自动去引号) atom = QuotedString("'").setParseAction(lambda s: s[0].strip("'")) # 2. 定义逻辑运算符 and_op = Keyword("AND") or_op = Keyword("OR") # 3. 递归定义表达式结构 expr = Forward() # 处理括号包裹的分组:( 表达式 ) group = Suppress("(") + expr + Suppress(")") # 基础表达式可以是原子变量或分组 base_expr = atom | group # 4. 用中缀表达式解析逻辑关系,支持运算符优先级(AND优先级高于OR) expr <<= infixNotation( base_expr, [ # 处理AND运算符,生成{"AND": [左操作数, 右操作数]} (and_op, 2, opAssoc.LEFT, lambda t: {"AND": [t[0][0], t[0][2]]}), # 处理OR运算符,生成{"OR": [左操作数, 右操作数]} (or_op, 2, opAssoc.LEFT, lambda t: {"OR": [t[0][0], t[0][2]]}), ] ) # 测试解析 str1 = "('a' AND ('b' OR 'c')) OR ('d' AND ('e' OR ('g' AND 'h')))" parsed_result = expr.parseString(str1, parseAll=True)[0] # 转换为YAML格式输出 print(yaml.dump(parsed_result, sort_keys=False))
输出结果
运行代码后会生成符合需求的YAML结构:
OR: - AND: - a - OR: - b - c - AND: - d - OR: - e - AND: - g - h
核心优势
- 自动处理任意深度的嵌套结构,无需手动拆分括号
- 准确识别
AND/OR的逻辑关系,生成的字典结构直接对应逻辑层级 - 支持运算符优先级配置(示例中设置
AND优先级高于OR,可根据需求调整)
内容的提问来源于stack exchange,提问作者AWaL
相关产品推荐
相关产品推荐

