1.# a = '1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))' 利用正则计算不用eval exec
思路:
(1)先把内层的小括号匹配出来,从里向外,
(2)然后计算小括号里面乘除的值,然后计算加减的值
(3)把计算好的结果进行替换,[字符串的替换]
"""
import re
# 计算乘除的方法
def parse_exp(exp):if "*" in exp:a,b = exp.split("*")# print(a,b)return str(float(a) * float(b))if "/" in exp:a,b = exp.split("/")return str(float(a) / float(b))# 去除++ +- -- -+ bug情况
def exp_format(exp):exp = exp.replace("+-","-")exp = exp.replace("--","+")exp = exp.replace("-+","-")exp = exp.replace("++","+")return exp# 实际计算
def exp_calc(strvar):# 计算乘除while True:res_obj = re.search("\d+(\.\d+)?[*/][+-]?\d+(\.\d+)?",strvar)if res_obj:res = res_obj.group()# print(res) #"5*-2"res2 = parse_exp(res)# print(res2)strvar = strvar.replace(res,res2)else:break# print(strvar)# 计算加减res = exp_format(strvar)# print(res)lst = re.findall("[+-]?\d+(?:\.\d+)?",res)# print(lst)count = 0for i in lst:count += float(i)# print(count)return count# 去除括号
def remove_bracket(strvar):while True:res_obj = re.search("\([^()]+\)",strvar)if res_obj:res_exp = res_obj.group()
# 取出的是对象的元素是一个字符串# print(res_exp)# 计算括号里面的值,exp_calcres = str(exp_calc(res_exp))# print(res,type(res))# 把算好的实际数值转换成字符串,替换以前的圆括号strvar = strvar.replace(res_exp,res)else:# 直接返回替换好的字符串return strvar
# 主函数
def main(strvar): # 先把所有的空格去掉 strvar = strvar.replace(" ","")# 去除括号res = remove_bracket(strvar)# print(res)# 计算最后结果return exp_calc(res)
# strvar = "- 30 +( 40+5*-2)* 2"
a = '1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'res = main(a)
# print(res)
# 验证结果
res = eval(a)
print(res)
运行结果:
2776672.695238095
注意:思想,分模块的思想,尽量把需要分开计算的东西就行模块化的编写。