import re def main(): s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )' s = s.replace(" ","") print(s) print('s is ',eval(s)) while True: li_s = re.findall('\([^()]+\)',s) if li_s: for i in li_s: ret = str(calOneExp(i)) s = s.replace(i,ret) else: break # while True: # ret = re.search('\([^()]+\)',s) # if ret: # inner = ret.group() # res = str(calOneExp(inner)) # s = s.replace(inner,res) # else: # break #此时s 为没有任何括号的表达式 final_res = calOneExp(s) print(final_res) return final_res def calAtomExp(exp): ''' 计算最小的表达式 :param exp:要计算的表达式 :return: 字符串型表达式结果 ''' if '*' in exp: a,b = exp.split('*') return str(float(a)*float(b)) elif '/' in exp: a, b = exp.split('/') return str(float(a) / float(b)) elif '+' in exp or '-' in exp: lst_others = re.findall(r'[+-]?\d+(?:\.\d+)?',exp) sum_others = 0 for i in lst_others: try: sum_others += float(i) except Exception: print('计算加减法时出现错误,请检查表达式是否合法') break return sum_others def formatExp(exp): exp = exp.replace('--','+') exp = exp.replace('+-','-') exp = exp.replace('++', '+') exp = exp.replace('-+', '-') return exp def calMulDivExp(exp): while True: lst_res = re.findall('\d+(?:\.\d+)?[*/]-?\d+(?:\.\d+)?', exp) if lst_res: for atom_exp in lst_res: mid_ret = calAtomExp(atom_exp) exp = exp.replace(atom_exp, mid_ret) else: break # 使用serch #使用serch while 就能循环出整个的结果,如果一开始用findall,还是得使用while,否则将导致替换后的结果,无法正确被计算 # while True: # one_result = re.search(r'\d+(\.\d+)?[*/]-?\d+(\.\d+)?',exp) # if one_result: # atom_exp = one_result.group() # mid_ret = calAtomExp(atom_exp) # #exp.replace( mid_ret,atom_exp) # exp = exp.replace(atom_exp,mid_ret) # else: # break return exp def calAddSub(exp): exp = formatExp(exp) exp_sum = calAtomExp(exp) return exp_sum def calOneExp(exp): ''' 计算表达式内乘除法子项的结果 :param exp: 要计算的表达式 :return: 计算后的字符串型表达式 ''' exp = calMulDivExp(exp) ret = calAddSub(exp) return ret #calOneExp('9-10.0/3+2.3333333333333335*24.75*2998+5680.0/14') main()