设计一个计算器计算字符串类型的算式
s = '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 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 = exp.replace('+-','-') exp = exp.replace('-+','-') exp = exp.replace('++','+') return exp def mul_div(exp): #乘除法计算 while True: ret = re.search('d+(.d+)?(?:e[+-]d+)?[*/]-?d+(.d+)?(?:e[+-]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+)?(?:e[+-]d+)?', exp) # (?:e[+-]d+)?返回所有满足匹配条件的结果,放在列表里 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 exp_sum # 返回计算结果为 float def main(exp): exp = exp.replace(' ', '') # 去除空格 while True: ret = re.search('([^()]+)', exp) # 匹配最里层括号 if ret: inner_bracket = ret.group() # 取出最里层括号算式 res = str(cal(inner_bracket)) # 计算最里层括号算式 exp = exp.replace(inner_bracket,res) # 计算出的结果替换匹配出的括号算式 exp = format_exp(exp) # 调用替换符号 else: break # 当再无括号匹配,则结束循环 return cal(exp) 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 = " 2 / ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )" ret = main(s) print(ret)