来自字符串的数学运算

Ell*_*lle 32 python string math

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

我想将这个字符串转换为Python中的标准数学运算,这样"2 + 2"就会返回4.

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

我想要正则表达式吗?

Mic*_*ers 54

使用eval函数.

print eval('2 + 4')
Run Code Online (Sandbox Code Playgroud)

输出:

6
Run Code Online (Sandbox Code Playgroud)

您甚至可以使用变量或常规python代码.

a = 5
print eval('a + 4')
Run Code Online (Sandbox Code Playgroud)

输出:

9
Run Code Online (Sandbox Code Playgroud)

您还可以获得返回值:

d = eval('4 + 5')
print d
Run Code Online (Sandbox Code Playgroud)

输出:

9
Run Code Online (Sandbox Code Playgroud)

或者呼叫功能:

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)')
Run Code Online (Sandbox Code Playgroud)

输出:

30
10
Run Code Online (Sandbox Code Playgroud)

如果你想编写一个解析器,也许你可以构建一个python代码生成器,如果这更容易并使用eval来运行代码.使用eval,您可以执行任何Python评估.

另一方面,正如其他人所提到的那样,eval并不安全,所以明智地使用它.

  • 是的,要真正小心eval人.由于问题(对我而言)意味着来自第三方的输入,您应该知道这不安全.国际海事组织这个答案应该在一开始就有一个重大警告. (20认同)
  • 与安装其他软件包相比,它对于个人使用来说仍然相当不错。 (2认同)

ber*_*eal 10

正则表达式无济于事.首先,您需要考虑运算符的优先级,其次,您需要使用正则表达式无法使用的括号.

根据您需要解析的表达式,您可以尝试Python AST或(更可能)pyparsing.但是,首先,我建议阅读一般语法分析和特别是分流码算法.

与使用的诱惑作斗争eval,这是不安全的.


zen*_*poy 8

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

 >>> eval("2   +    2")
 4
Run Code Online (Sandbox Code Playgroud)

注意我在字符串中包含空格的事实.eval将执行一个字符串就好像它是一个Python代码一样,所以如果你想让输入是Python以外的语法,你应该自己解析字符串并计算,例如eval("2x7")不会给你14因为Python *用于乘法运算符而不是比x.


Gar*_*erg 6

如果你想安全地做,你可能想使用http://docs.python.org/library/ast.html#ast.literal_eval

从这个回答: Python"安全"eval(字符串到bool/int/float/None/string)

它可能不会进行数学运算,但您可以解析数学运算符,然后对安全评估的术语进行操作.


MOH*_*EEM 5

您可以使用与该功能相同的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
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

88125 次

最近记录:

8 年,11 月 前