1 #(1)先找到最里层没有括号的括号
2 #(2)用正则表达式找打乘除式子
3 #(3)用正则表达式找打加减式子
4 #(4) 在乘除
5 #(5) 在加减
6 #(6) 在去符号
7 #(7) 最后算结果
8 import re
9 def atom_cal(exp): #如果是乘除法,则计算
10 if '*' in exp: #判断*在不在
11 a,b = exp.split('*') #在的话就分割
12 return str(float(a) * float(b))#计算 数字是浮点型 把结果转化成字符串 是因为在下面的函数中要调用它(exp = exp.replace(atom_exp,res))
13 elif '/' in exp: #判断除法
14 a, b = exp.split('/') #分割
15 return str(float(a) / float(b)) #相除
16
17 def format_exp(exp): #符号的判断
18 exp = exp.replace('--','+') #+代替--
19 exp = exp.replace('+-','-') #-代替+-
20 exp = exp.replace('-+','-') #-+代替-+
21 exp = exp.replace('++','+') #++代替+
22 return exp
23
24 def mul_div(exp): #找到乘除法
25 while True:
26 ret = re.search('\d+(\.\d+)?[*/]-?\d+(\.\d+)?',exp) #利用正则表达式
27 if ret: #如果找到
28 atom_exp = ret.group() #则获取
29 res = atom_cal(atom_exp) #再次调用乘除法的函数
30 exp = exp.replace(atom_exp,res) #计算完成 用结果替换之前的内容 res就是乘除法运算出来的结果
31 else:return exp
32
33 def add_sub(exp): #找到加减法的函数
34 ret = re.findall('[+-]?\d+(?:\.\d+)?', exp)#利用正则表达式找打+-法 ?:是取消优先级 这个正则表达式是找到数字前面的括号
35 exp_sum = 0 #定义一个总和为0
36 for i in ret: #i 的结果是 2 -5 +9 意思就是带着括号一起的
37 exp_sum += float(i) #再把 他们加在一起 如 2-5+9
38 return exp_sum
39
40 def cal(exp): #调用各种函数
41 exp = mul_div(exp) #调用乘除法的函数
42 exp = format_exp(exp) #调用+-符号的判断函数
43 exp_sum = add_sub(exp) # 调用加减的函数
44 return exp_sum # float
45
46 def main(exp): #主函数
47 exp = exp.replace(' ','') #去掉空格
48 while True:
49 ret = re.search('\([^()]+\)',exp) #找到最里层括号
50 if ret : #如果是最里层括号 且不包含括号 如 (40/5) (-8+9) 这种
51 inner_bracket = ret.group() #利用.group () 取出
52 res = str(cal(inner_bracket))#res 是计算出来的结果 比如(40/5) 算出res=8 先走cal()函数 再在cal()函数中找到乘除法加减的函数运算
53 exp = exp.replace(inner_bracket,res) #再用结果代替算式 比如用 res=8 代替(40/5) 在继续找括号
54 exp = format_exp(exp) #再把结果中含 -- 换成+ (调用format_exp)
55 else:break
56 return cal(exp) #返回最后结果
57
58 s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
59 ret = main(s)
60 print(ret,type(ret))