如何从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
相关产品推荐
相关产品推荐

