math运算从string

假设我有一个标准的Pythonstring(比如从raw_input()获得的),为了简单起见,也许是"2 + 2"

我想将这个string转换为Python中的标准math运算,例如"2 + 2"将返回4

有没有一个简单的方法来做到这一点,或者我将不得不分裂的空间和手动parsing每个数字/符号,然后根据我find的math呢?

我需要Regex吗?

使用eval函数。

 print eval('2 + 4') 

输出:

 6 

你甚至可以使用variables或常规的Python代码。

 a = 5 print eval('a + 4') 

输出:

 9 

你也可以得到返回值:

 d = eval('4 + 5') print d 

输出:

 9 

或者调用函数:

 def add(a, b): return a + b def subtract(a, b): return a - b a = 20 b = 10 print eval('add(a, b)') print eval('subtract(a, b)') 

输出:

 30 10 

如果你想写一个parsing器,也许你可以build立一个Python代码生成器,如果更容易,使用eval来运行代码。 用eval你可以执行任何Python评估。

另一方面,正如其他人所说,eval是不安全的,所以明智地使用它。

正则expression式不会有太大帮助。 首先,你要考虑到运算符的优先级,其次,你需要使用正则expression式不可能的圆括号。

根据你需要parsing什么types的expression式,你可以尝试Python AST或(更可能) pyparsing 。 但是,首先,我build议阅读一些有关语法分析的内容,尤其是关于调车码algorithm 。

并且抵制使用eval的诱惑,那是不安全的。

最简单的方法是使用eval如下所示:

  >>> eval("2 + 2") 4 

注意我在string中包含空格的事实。 eval将执行一个string,就像它是一个Python代码一样,所以如果你希望input的语法不是Python,你应该自己parsingstring并计算,例如eval("2x7")不会给你14因为Python使用乘法运算符而不是x

如果您想安全地使用它,您可能需要使用http://docs.python.org/library/ast.html#ast.literal_eval

从这个答案: Python“安全”eval(string到布尔/整数/浮动/无/string)

它可能不会做math,但是你可以parsingmath运算符,然后运行安全评估的术语。

提问者评论道:

我认为,如果我理解一个问题的程度足以编写一个可以算出来的程序,我不需要手动完成这个工作。

如果他正在写mathexpression式求解器作为学习练习,那么使用eval()是不会有帮助的。 另外这是可怕的devise。

您可以考虑使用逆波兰符号而不是标准的math符号来制作一个计算器。 它大大简化了parsing。 这仍然是一个很好的练习

你可以使用这个函数,它和eval()函数一样,但是使用一个简单的函数。

 def numeric(equation): if '+' in equation: y = equation.split('+') x = int(y[0])+int(y[1]) elif '-' in equation: y = equation.split('-') x = int(y[0])-int(y[1]) return x 

一个简单的方法,但这样做的危险的方法是使用eval()eval()执行传递给它的string作为代码。 这样做的危险之处在于,如果这个string是从用户input中获得的,他们可能会恶意执行可能破坏计算机的代码。 我会得到input,用正则expression式检查它,然后执行它,如果你确定是否可以。 如果只是格式“数字操作号码”,那么你可以使用一个简单的正则expression式:

 import re s = raw_input('What is your math problem? ') if re.findall('\d+? *?\+ *?\d+?', s): print eval(s) else: print "Try entering a math problem" 

否则,你将不得不拿出比这更严格的东西。 你也可以反过来用一个正则expression式来查找是否有某些东西不在其中,比如数字和操作。 你也可以检查input是否包含某些命令。

最好的办法是做:

print eval("2 + 2")

如果你想要你可以使用一个variables:

addition = eval("2 + 2") print addition

如果你真的想,你可以使用一个函数:

def add(num1, num2): eval("num1 + num2")