Equation parsing in Python
我如何(轻松地)获取一个字符串,比如用户在运行时输入的
如果使用python符号,python自己的内部编译器就可以解析它。
如果你稍微改变一下符号,你会更高兴的。
1 2 3 | import compiler eq="sin(x)*x**2" ast= compiler.parse( eq ) |
号
您可以使用一个抽象语法树。
您可以使用python
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) |
它的性能比纯
1 | f = parser.parse('sin(x)*x^2').to_pyfunc() |
其中,可以使用ply、pyparsing、builtin tokenizer、parser和ast定义
不要在用户输入上使用
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的替代品,在介绍视频中,它演示了如何处理类似于您的案例。它们似乎支持各种各样的方法。由于代码是开放源码的,您可以自己浏览并查看作者如何处理此类情况。