用Python解析方程式

Wal*_*mly 38 python parsing equation

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

S.L*_*ott 46

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

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

import compiler
eq= "sin(x)*x**2"
ast= compiler.parse( eq )
Run Code Online (Sandbox Code Playgroud)

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

  • 不要对来自外部来源(例如网络)的数据使用 eval,因为这是一个简单的攻击媒介。 (8认同)
  • 自 Python 2.6 起不推荐使用编译器模块。这个答案已过时 (4认同)
  • @hagubear这里描述了用于python 3的`compiler`模块的替换:http://stackoverflow.com/questions/909092/why-is-the-compiler-package-discontinued-in-python-3 (3认同)
  • @Don:您不需要使用语法树.使用原始功能.`eval("sin(x)*x**2")`设置`x`并使用`from math import*`. (2认同)
  • `import compiler`不适用于Python 3.3请你更新你的答案+标签,以确保读者知道它是哪一个.这是一个很好的问题,应该涵盖相关的标签. (2认同)

Don*_*Don 30

你可以使用Python parser:

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

from math import sin
x = 10
print eval(code)
Run Code Online (Sandbox Code Playgroud)

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

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

jfs*_*jfs 14

 f = parser.parse('sin(x)*x^2').to_pyfunc()
Run Code Online (Sandbox Code Playgroud)

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

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

  • 用户输入的'eval`确实很糟糕. (5认同)

cry*_*ryo 7

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

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

  • Pyparsing 不再托管在 wikispaces.com 上。转到 https://github.com/pyparsing/pyparsing (2认同)