Python使用ast解析方程表达式时变量名顺序异常问题求解
问题根因
你遇到的var1列表顺序异常,核心原因是ast.walk()采用深度优先逻辑遍历语法树节点,遍历顺序和源代码中变量的字面出现顺序完全不匹配,你收集到的names2列表本身顺序就不符合预期,拆分后var1的顺序自然不对。
解决方案
推荐用正则匹配的方案实现,代码更简单,且匹配顺序完全和原方程的字符出现顺序一致:
import re eq_list2 = ["der_w_hSP - w_FW + 2*t_FW", "2*der_t_CP - R_CI + R_CO", "3*der_w_BSS - w_FW + 4*s_CI + 2*s_BRC + 3*t_BW + 2*t_CW"] var2 = [] var1 = [] # 匹配变量名的正则:字母/下划线开头,后续是字母/数字/下划线 var_pattern = re.compile(r'[a-zA-Z_][a-zA-Z0-9_]*') for eq in eq_list2: # 按字符顺序提取所有变量 vars_in_eq = var_pattern.findall(eq) for var in vars_in_eq: if var.startswith('der_'): var2.append(var) else: var1.append(var) print(var2) print(var1)
运行输出
['der_w_hSP', 'der_t_CP', 'der_w_BSS'] ['w_FW', 't_FW', 'R_CI', 'R_CO', 'w_FW', 's_CI', 's_BRC', 't_BW', 't_CW']
如果必须用AST实现,可以通过ast.Name节点的col_offset属性排序,保证提取的变量顺序和原代码出现顺序一致:
import ast eq_list2 = ["der_w_hSP - w_FW + 2*t_FW", "2*der_t_CP - R_CI + R_CO", "3*der_w_BSS - w_FW + 4*s_CI + 2*s_BRC + 3*t_BW + 2*t_CW"] var2 = [] var1 = [] for eq in eq_list2: tree = ast.parse(eq) name_nodes = [] for node in ast.walk(tree): if isinstance(node, ast.Name): # 存储节点的列偏移和id,后续按列偏移排序 name_nodes.append((node.col_offset, node.id)) # 按出现位置从小到大排序 name_nodes.sort() vars_in_eq = [n[1] for n in name_nodes] for var in vars_in_eq: if var.startswith('der_'): var2.append(var) else: var1.append(var) print(var2) print(var1)
运行结果和正则方案完全一致。
内容的提问来源于stack exchange,提问作者ASureda
相关产品推荐
相关产品推荐

