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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 14:51:03