假设我有一个标准的Python字符串(例如从raw_input()
获得的字符串),为简单起见,可能是"2 + 2"
。
我想将此字符串转换为Python中的标准数学运算,以便"2 + 2"
返回4
。
有没有一种简单的方法可以做到这一点,或者我是否需要拆分空格并手动解析每个数字/符号,然后根据我发现的数据进行算术运算?
我想要正则表达式吗?
答案 0 :(得分:46)
使用eval功能。
print eval('2 + 4')
输出:
6
您甚至可以使用变量或常规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
如果你想编写一个解析器,也许你可以构建一个python代码生成器,如果这更容易并使用eval来运行代码。使用eval,您可以执行任何Python评估。
另一方面,正如其他人所提到的那样,eval不安全所以明智地使用它。
答案 1 :(得分:8)
正则表达式无济于事。首先,您需要考虑运算符的优先级,其次,您需要使用正则表达式无法使用的括号。
根据您需要解析的表达式的类型,您可以尝试Python AST或(更有可能)pyparsing。 但是,首先,我建议您阅读有关syntax analysis的内容,特别是Shunting yard algorithm。
与使用eval
的诱惑作斗争,这是不安全的。
答案 2 :(得分:6)
最简单的方法是使用eval
,如下所示:
>>> eval("2 + 2")
4
注意我在字符串中包含空格的事实。 eval
将执行一个字符串,就好像它是一个Python代码一样,所以如果你希望输入是Python以外的语法,你应该自己解析字符串并计算,例如eval("2x7")
不会给你14因为Python使用*
作为乘法运算符而不是x
。
答案 3 :(得分:5)
如果您想安全地进行,可能需要使用http://docs.python.org/library/ast.html#ast.literal_eval
从这个回答: Python "safe" eval (string to bool/int/float/None/string)
它可能不会进行数学运算,但您可以解析数学运算符,然后对安全评估的术语进行操作。
答案 4 :(得分:4)
提问者评论道:
我认为如果我能够很好地理解一个能够解决问题的程序,我就不需要手动完成工作了。
如果他正在编写数学表达式求解器作为学习练习,使用eval()
将无济于事。加上它的设计非常糟糕。
您可以考虑使用Reverse Polish Notation而不是标准数学符号来制作计算器。它大大简化了解析。这仍然是一个很好的练习
答案 5 :(得分:4)
您可以使用与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
答案 6 :(得分:3)
一种简单的方法,但执行此操作的危险方法是使用eval()
。 eval()
执行作为代码传递给它的字符串。关于这一点的危险之处在于,如果从用户输入获得此字符串,则他们可能会恶意执行可能破坏计算机的代码。我会得到输入,用正则表达式检查它,然后执行它,如果你确定它是否正常。如果它只是采用“数字操作号”的格式,那么你可以使用一个简单的正则表达式:
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"
否则,你必须想出一些比这更严格的东西。您也可以相反地使用正则表达式来查找是否存在某些事物,例如数字和操作。您还可以检查输入是否包含某些命令。
答案 7 :(得分:2)
最好的办法是:
print eval("2 + 2")
如果您愿意,可以使用变量:
addition = eval("2 + 2")
print addition
如果你真的想,你可以使用一个函数:
def add(num1, num2):
eval("num1 + num2")