#!/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))