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

如何从pyparsing嵌套解析结果中提取所有变量

提取pyparsing嵌套公式中所有变量的方法

我正在修改pyparsing的fourFn示例以支持变量,求值功能已实现,现需解析公式字符串并输出所需变量列表。已为标识符添加set_results_name('identifier', list_all_matches=True),无嵌套公式可正常提取变量,但嵌套公式下仅能获取最外层变量——所有变量分布在不同层级,不想暴力遍历或重复解析,寻求提取所有嵌套变量的方法。

测试示例

无嵌套公式情况

>>> formula = 'x * y + z'
>>> res = fp.parse_string(formula)
>>> res.identifier
ParseResults(['x', 'y', 'z'], {})

嵌套公式情况(问题场景)

>>> formula = '(x * y - (a/b)) + z'
>>> res = fp.parse_string(formula)
>>> res.identifier
ParseResults(['z'], {})
>>> print(res.dump())
[['x', '*', 'y', '-', ['a', '/', 'b']], '+', 'z']
- identifier: ['z']
[0]:
  ['x', '*', 'y', '-', ['a', '/', 'b']]
  - identifier: ['x', 'y']
  [0]:
    x
  [1]:
    *
  [2]:
    y
  [3]:
    -
  [4]:
    ['a', '/', 'b']
    - identifier: ['a', 'b']
[1]:
  +
[2]:
  z

解决方案

pyparsing的ParseResults提供了find_all()方法,可递归遍历整个解析结果结构,提取所有指定名称的结果,完美适配嵌套场景。

实现方法

在你的FormulaParser类中添加get_variables方法,利用find_all()递归收集所有层级的变量:

from my_module.parser import FormulaParser  # 你的原有导入

class FormulaParser:
    # 此处保留你已实现的解析逻辑(fourFn修改后的代码)
    
    def get_variables(self, formula):
        parse_result = self.parse_string(formula)
        # 递归查找所有名为'identifier'的结果
        all_id_groups = parse_result.find_all('identifier')
        # 扁平化所有变量列表并去重(保持首次出现顺序)
        variables = []
        for group in all_id_groups:
            variables.extend(group)
        return list(dict.fromkeys(variables))

测试验证

formula = '(x * y - (a/b)) + z'
fp = FormulaParser()
print(fp.get_variables(formula))
# 输出: ['x', 'y', 'a', 'b', 'z']

简化写法

也可以用生成器表达式精简代码:

def get_variables(self, formula):
    parse_result = self.parse_string(formula)
    return list(dict.fromkeys(
        var for id_group in parse_result.find_all('identifier') for var in id_group
    ))

说明

find_all('identifier')会自动遍历ParseResults的所有嵌套层级,收集所有标记为identifier的结果集合,无需手动遍历每个节点或重复解析公式,高效解决嵌套变量提取问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:35:15