用Python解析方程式

Equation parsing in Python

我如何(轻松地)获取一个字符串,比如用户在运行时输入的"sin(x)*x^2",并生成一个python函数,可以对x的任何值进行评估?


如果使用python符号,python自己的内部编译器就可以解析它。

如果你稍微改变一下符号,你会更高兴的。

1
2
3
import compiler
eq="sin(x)*x**2"
ast= compiler.parse( eq )

您可以使用一个抽象语法树。


您可以使用python parser

1
2
3
4
5
6
7
import parser
formula ="sin(x)*x**2"
code = parser.expr(formula).compile()

from math import sin
x = 10
print eval(code)

它的性能比纯eval好,当然,还避免了代码注入!


1
 f = parser.parse('sin(x)*x^2').to_pyfunc()

其中,可以使用ply、pyparsing、builtin tokenizer、parser和ast定义parser

不要在用户输入上使用eval


pyparsing可能会按您的需要(http://pyparsing.wikispaces.com/)执行,尤其是当字符串来自不受信任的源时。

另请参见http://pyparsing.wikispaces.com/file/view/fourfn.py,了解使用它构建的功能齐全的计算器。


为了强调J.F.Sebastian的建议,"eval"甚至"compiler"解决方案都可能存在细微的安全漏洞。输入的可信度如何?使用"compiler",你至少可以从ast中过滤出getattr查找之类的内容,但是我发现,对于这类内容,使用ply或pyparsing比确保让python提供帮助的结果更容易。

另外,"编译器"既笨拙又难以使用。它在3.0中被弃用并删除。您应该使用"ast"模块(在2.6中添加,在2.5中可用作"ast")。


与Vartec达成协议。我会使用sympy——特别是lambdafiy函数应该完全按照您的要求执行。

请参见:http://showmedo.com/videotutorials/video?名称=7200080&fromseriesid=720

对于这件事的一个很好的解释。

最美好的祝福,


SAGE是Matlab的替代品,在介绍视频中,它演示了如何处理类似于您的案例。它们似乎支持各种各样的方法。由于代码是开放源码的,您可以自己浏览并查看作者如何处理此类情况。