当前位置:  开发笔记 > 编程语言 > 正文

用Python解析方程式

如何解决《用Python解析方程式》经验,为你挑选了4个好方法。

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



1> S.Lott..:

如果使用Python表示法,Python自己的内部编译器可以解析它.

如果你稍微改变符号,你会更快乐.

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

您将获得一个可以使用的抽象语法树.


@hagubear这里描述了用于python 3的`compiler`模块的替换:http://stackoverflow.com/questions/909092/why-is-the-compiler-package-discontinued-in-python-3
@Don:您不需要使用语法树.使用原始功能.`eval("sin(x)*x**2")`设置`x`并使用`from math import*`.
`import compiler`不适用于Python 3.3请你更新你的答案+标签,以确保读者知道它是哪一个.这是一个很好的问题,应该涵盖相关的标签.

2> Don..:

你可以使用Python parser:

import parser
formula = "sin(x)*x**2"
code = parser.expr(formula).compile()

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

它表现得比纯粹好eval,当然也避免了代码注入!


需要注意的一件重要事情是在用户输入上使用纯`eval()`可能是[**非常危险**](/sf/ask/17360801/一个坏实践/ 1832957#1832957).
我不确定这比在字符串本身上使用eval更好.它仍然会愉快地执行所有代码,而不仅仅是公式.包括os.system调用之类的错误.`>>> eval(parser.expr("os.system('echo evil syscall')").compile())``evil syscall`

3> jfs..:
 f = parser.parse('sin(x)*x^2').to_pyfunc()

哪里parser可以使用PLY,pyparsing,内置标记器,解析器,ast定义.

不要eval在用户输入上使用.


用户输入的'eval`确实很糟糕.

4> cryo..:

pyparsing可能会做你想要的(http://pyparsing.wikispaces.com/),特别是如果字符串来自不受信任的来源.

另请参阅http://pyparsing.wikispaces.com/file/view/fourFn.py,了解使用它构建的功能完备的计算器.

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有