import re def atom_cal(exp): 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)) def format_exp(exp): #处理符号 exp = exp.replace(' ', '') #处理空格 exp = str(exp).replace('--', '+') exp = str(exp).replace('-+', '-') exp = str(exp).replace('+-', '-') exp = str(exp).replace('++', '+') return exp def mul_div(exp): #筛选出乘除法 while True: ret = re.search('-?d+(?:.d+)?[*/]-?d+(?:.d+)?', exp) if ret: atom_exp = ret.group() res = atom_cal(atom_exp) #计算乘除 exp = exp.replace(atom_exp, res) #替换 else: return exp #乘除法算完了,返回原参数 def add_sub(exp): #计算加减法 ret = re.findall('[+-]?d+(?:.d+)?', exp) #匹配带符号的数字,返回一个列表 exp_sum = 0 for i in ret: exp_sum += float(i) return exp_sum def cal(exp): #计算加减乘除混合运算 exp = mul_div(exp) #先算乘除 exp = format_exp(exp) #处理符号 exp_sum = add_sub(exp) #计算加减 return str(exp_sum) def main(exp): exp = exp.replace(' ', '') #删除空格 while True: ret = re.search('([^()]*)', exp) #匹配括号 if ret: inner_bracket = ret.group() # print(inner_bracket) res = cal(inner_bracket) exp = exp.replace(inner_bracket, res) #替换 exp = format_exp(exp)#处理符号 else: break #没有括号跳出循环 return cal(exp) # s = '1 + 2+(2*3)+(4/2*3+1)+1+(1+(2*3/6-(-1+1)))' # s = '1-2*((3+1)+1)' 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 = '1-2*3' ret3 = main(s) print(ret3)