使用正则表达式或与 pandas 相同的表达式解析器查找 pandas.eval() 的变量

问题描述 投票:0回答:1

我有大量变量可以在脚本中调用并由

pandas.eval()
进行评估。 这实际上是一个数学评估器。 但是,在执行之前,我们必须从多个数据源组装数据帧
eval()
。 这意味着我需要解析我们给出的方程,执行搜索方法并找到命名变量,将它们合并到数据帧中,最后执行
eval()
方法。

我尝试使用正则表达式来执行此操作,这可能仍然是答案,但是当变量名称中包含空格时,一切都会陷入困境。 我是正则表达式新手。

然后我进入了

pandas.evel()
源代码:https://github.com/pandas-dev/pandas/blob/main/pandas/core/computation/expr.py尝试复制Pandas的方法正在使用,因为他们必须做同样的事情。 事实证明,他们对名称中的空格也没有一个好的答案(herehere)。

我仍然喜欢使用与 pandas 相同的解析的想法,因为这是最强大的解决方案。 Pandas 使用来自

Expr
pandas.core.computation.expr
来源)。 但当我尝试使用该方法时,我遇到了各种错误。 我可以重建生成上下文的整个序列,并将在 pandas.eval() 中工作的相同字符串传递给它(这一行中的所有内容:
Expr(simpeval, engine=engine, parser=parser, env=env)
),我得到
pandas.core.computation.ops.UndefinedVariableError: name 'var1' is not defined
。我不明白
pandas.eval()
在第 345 行上是如何做的并且没有收到此错误。

我想我只是需要更多的头脑来解决这个问题。 我正在尝试从字符串 eval 表达式中获取所有变量的列表(允许带有空格的列名称)。

理想的结果:

in
eval_string = "(var1 / var with spaces 2) + var with spaces 3"
parsed_vars = magic_of_stack_overflow(eval_String)
parsed_vars

out
["var1","var with spaces 2","var with spaces 3"]

理想的理想结果: 我可以做同样的事情,但是使用我将在 pandas 中传递表达式的确切解析器。

我会对其中任何一个感到兴奋。

编辑: 蟒蛇3.12 熊猫1.3.5

python pandas regex eval expr
1个回答
0
投票

您可以使用正则表达式来识别以字母开头、没有运算符作为字符并以非空格有效字符结尾的字符串:

import re

eval_string = "(var1 / var with spaces 2) + var with spaces 3"

out = re.findall(r'[a-zA-Z][^()/+-]+[^()/\-+ ]', eval_string)

输出:

['var1', 'var with spaces 2', 'var with spaces 3']

正则表达式演示

© www.soinside.com 2019 - 2024. All rights reserved.