import re def cal_atomexp(atom_exp): # 计算乘除法 if '*' in atom_exp: a, b = atom_exp.split('*') return str(float(a) * float(b)) elif '/' in atom_exp: a, b = atom_exp.split('/') return str(float(a) / float(b)) def cal_muldiv(inner_bracket): while True: # 计算括号里的所有乘除法 ret = re.search('d+(.d+)?[*/]-?d+(.d+)?', inner_bracket)# 匹配第一个乘除法 if not ret: break atom_exp = ret.group() # 获取乘除法表达式 # 2*5 atom_res = cal_atomexp(atom_exp) # 计算乘除法的函数,得到结果 10.0 inner_bracket = inner_bracket.replace(atom_exp, str(atom_res)) # 将得到的结果与匹配到的表达式进行替换 return inner_bracket # 返回的是一个纯加减法组成的算式 def cal_addsub(inner_bracket): # 计算括号中的所有加减法 ret_l = re.findall('[-+]?d+(?:.d+)?', inner_bracket) # 找到所有的数字以及它前面的符号 sum = 0 for ret in ret_l: sum+=float(ret) return str(sum) def format_exp(exp): # 给表达式做格式化 exp = exp.replace('--','+') exp = exp.replace('+-','-') exp = exp.replace('++','+') exp = exp.replace('-+','-') return exp def cal_bracket(exp): # 计算括号内的 exp = cal_muldiv(exp) # 括号内的 : 计算了所有乘除法,只剩下加减法的表达式 exp = format_exp(exp) # 计算完乘除法之后,会有一些符号问题,要替换掉所有++ -- -+ +-的情况 return cal_addsub(exp) # 计算所有的加减法 def main(s): # s = 总表达式 s = s.replace(' ', '') # 给总表达式s去空格,去掉空格之后s是没有空格的表达式 while True: inner_bracket = re.search('([^()]+)', s) # 找最内层的小括号,得到一个对象 if not inner_bracket: break # 找不到小括号了就退出 inner_bracket = inner_bracket.group() # 通过对象.group()得到一个内部没有小括号的表达式 res = cal_bracket(inner_bracket) # 计算表达式 s = s.replace(inner_bracket, res) # 用括号内的计算结果去替换匹配到的括号赋值给s return cal_bracket(s) s = '1-2*((60-30 +(9-2*5/3+7/3*99/4*2998+10*568/14)*(-40 / 5))-(-4*3)/(16-3*2))' print(main(s)) # 程序的总入口 print(eval(s))
总体思路就是先算最内层括号里的乘除,然后再算加减 ,通过对函数体的循环得到最终结果.