#!/bin/env python # -*- coding:utf-8 -*- ''' 实现能计算类似 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))公式 ''' import re def cal_mini_exp(mini): #计算40/5 2*5这样的表达式 if '*' in mini: mun1,mun2 = mini.split('*') return str(float(mun1) * float(mun2)) elif '/' in mini: mun1, mun2 = mini.split('/') return str(float(mun1) / float(mun2)) def conform(exp): exp = exp.replace('--','+') exp = exp.replace('+-','-') exp = exp.replace('-+','-') exp = exp.replace('++','+') return exp def calculate(son_exp): ''' 计算内部不在有小括号表达式的结果 :param exp: :return: ''' son_exp = son_exp.strip('()') while True: #完成一个表达式乘除法的计算 ret = re.search('\d+\.?\d*[*/]-?\d+\.?\d*',son_exp) #9-2*5/3+7/3*99/4*2998+10*568/14 匹配乘除表达式 if ret: mini_exp = ret.group() # 40/5 2*5 res = cal_mini_exp(mini_exp) #40/5=8 son_exp = son_exp.replace(mini_exp,res,1) else:break son_exp = conform(son_exp) #整理表达式中的符号 ret_l = re.findall('[+-]?\d+\.?\d*',son_exp) sum = 0 for i in ret_l: sum += float(i) return str(sum) exp = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))' a = exp #去空格 exp = exp.replace(' ','') #print(exp) while True: #把表达中所有的小括号表达式都计算出来 ret = re.search('\([^()]+\)',exp) #是否匹配上的对象 if ret: son_exp = ret.group() #子表达式 print('匹配小括号:%s' % son_exp) #计算乘除法,再计算加减 ret = calculate(son_exp) exp = exp.replace(son_exp,ret,1) else: break print('最外层括号表达式:%s' % exp) ret = calculate(exp) print(ret) print('eval结果:',eval(a))