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")