来自字符串的数学运算

时间:2012-03-13 14:23:38

标签: python string math

假设我有一个标准的Python字符串(例如从raw_input()获得的字符串),为简单起见,可能是"2 + 2"

我想将此字符串转换为Python中的标准数学运算,以便"2 + 2"返回4

有没有一种简单的方法可以做到这一点,或者我是否需要拆分空格并手动解析每个数字/符号,然后根据我发现的数据进行算术运算?

我想要正则表达式吗?

8 个答案:

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