字符串评估

时间:2019-07-07 12:48:21

标签: python python-3.x

我有一个字符串str1 = " 2*PI",其中PI是全局字符串PI = "1*pi"

如果我执行eval(str1),它将尝试评估1.*pi1.*pi。如何获得将其评估为2*(1*pi)即2 pi的值?

3 个答案:

答案 0 :(得分:3)

eval(str1)返回1.*pi1.*pi,因为eval(str1)的值为2*"1*pi",并且字符串和整数之间的乘法会导致字符串的重复。

直接将字符串格式设置为str1

from math import pi
PI = "1*pi"
str1 = f"2*({PI})"   # or for versions < Python-3.6: "2*({})".format(PI)

print(str1)          # '2*(1*pi)'
print(eval(str1))    # 6.283185307179586

如果您不受PI的控制,则可以先计算PI,然后将其格式化为表达式。

eval(f"2*({eval(PI)})") # or equivalently eval("2*({})".format(eval(PI)))

如果您也不控制str1,则可以用其文字字符串值PI替换所有1*pi标记。

eval(str1.replace('PI', PI))

但这不能处理诸如2*PIE之类的极端情况(如果有的话)。更加健壮的解决方案是使用正则表达式,并在PI字符周围加上\b字符以匹配完整的令牌。

import re
eval(re.sub(r'\bPI\b', PI, str1))

这适当地排除了诸如2*PIZZA2*API之类的字符串。

答案 1 :(得分:2)

如果评估-eval()-首先是PI字符串,然后通过str()命令将评估值作为str插入到str1中,然后评估str1

from math import *

PI = "1*pi"
str1 = "2*PI" 

PI = str(eval(PI)) # Turns our PI string into a number
str1 = str1.replace("PI",PI) # Sets our PI number in

print(eval(str1)) # Calculates it one last time

输出

6.283185307179586

答案 2 :(得分:1)

感谢先评估似乎已经解决了问题。

所以我现在有

from math import pi

PI = eval("1*pi")
str1 = "2*PI"
eval(str1)

避免了任何替换