字符串求值

2024-09-24 04:19:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

如果我执行eval(str1),它会尝试计算1.*pi1.*pi。我如何得到它,作为2*(1*pi)即2pi计算?你知道吗


Tags: 字符串evalpi全局str1pi1
3条回答

如果先计算-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

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(如果它们出现的话)。一个更健壮的解决方案是使用regex并用PI字符环绕\b以匹配完整的令牌。你知道吗

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

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

感谢你,我似乎已经解决了这个问题。你知道吗

所以我现在有了

from math import pi

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

避免了任何替换的需要

相关问题 更多 >