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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:00:38