实现能计算类似1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式的计算器程序用正则表达式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # 实现能计算类似 2 s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )' 3 # 等类似公式的计算器程序 4 ss = '' 5 for i in s: 6 if i != ' ': 7 ss += i 8 import re 9 ret = re.split('[()/]',re.search('\(\-?\d+[/]\d+\)',ss).group()) 10 for i in range(ret.count('')):ret.remove('') 11 fin = float(ret[0])/float(ret[1]) #(-40/5) 12 ret1 = re.split('[(*\-+/]',re.search('[*/]\(\d+[\-]\d+[*]\d+[/]\d+',ss).group()) 13 for i in range(ret1.count('')):ret1.remove('') 14 fin1 = float(ret1[0])-float(ret1[1])*float(ret1[2])/float(ret1[3])#*(9-2*5/3 15 ret2 = re.split('[+*/]',re.search('[+]\d+[/]\d+[*]\d+[/]\d+[*]\d+',ss).group()) 16 for i in range(ret2.count('')):ret2.remove('') 17 fin2 = float(ret2[0])/float(ret2[1])*float(ret2[2])/float(ret2[3])*float(ret2[4]) #+7/3*99/4*2998 18 ret3 = re.split('[+*/)]',re.search('[+]\d+[*]\d+[/]\d+\)',ss).group()) 19 for i in range(ret3.count('')):ret3.remove('') 20 fin3 = float(ret3[0])*float(ret3[1])/float(ret3[2]) #+10*568/14) 21 ret4 = re.split('[(\-]',re.search('\(\d+[\-]\(?[\-]?\d+\)?',ss).group()) 22 for i in range(ret4.count('')):ret4.remove('') 23 fin4 = float(ret4[0])-float(ret4[1]) #(60-30 24 ret5 = re.split('[()*]',re.search('\([\-]?\d+[*]\(?[\-]?\d+\)?\)',ss).group()) 25 for i in range(ret5.count('')):ret5.remove('') 26 fin5 = float(ret5[0])*float(ret5[1]) #(-4*3) 27 ret6 = re.split('[/()\-*]',re.search('[/]\(\(?[\-]?\d+[\-]\(?[\-]?\d+\)?[*]\(?[\-]?\d+\)?\)\)',ss).group()) 28 for i in range(ret6.count('')):ret6.remove('') 29 fin6 = float(ret6[0])-float(ret6[1])*float(ret6[2]) #/(16-3*2)) 30 ret7 = re.match('\(?[\-]?\d+\)?',ss).group() 31 fin7 = float(ret7) #1 32 ret8 = re.split('[\-*(]',re.search('\(?[\-]?\d+\)?[*]\(\(',ss).group()) 33 for i in range(ret8.count('')):ret8.remove('') 34 fin8 = float(ret8[0]) 35 fin9 = fin7-fin8*(fin4+fin*(fin1+fin2+fin3))-fin5/fin6 36 print(fin9) 37 print(eval('1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'))
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 实现能计算类似 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+1+1+' # 等类似公式的计算器程序 import re def cpu_md(ss):#计算乘除 while True: try: ret = re.search('\d+\.?\d*[*/][\-]?\d+\.?\d*', ss).group() if ret: if '*' in ret: ret1 = re.split('[*]', ret) ret2 = float(ret1[0]) * float(ret1[1]) ss = re.sub('\d+\.?\d*[*/][\-]?\d+\.?\d*', str(ret2), ss, 1) if '/' in ret: ret1 = re.split('[/]', ret) ret2 = float(ret1[0]) / float(ret1[1]) ss = re.sub('\d+\.?\d*[*/][\-]?\d+\.?\d*', str(ret2), ss, 1) else: return ss except: return ss def cpu_mdi(ss):#计算括号内加减eg:(1+2-4) while True: try: ret = re.search('[\-]?\d+\.?\d*[\-+]\d+\.?\d*[^*+\-/)]', ss).group() if '+' in ret: ret1 = re.split('[+]', ret) ret2 = float(ret1[0]) + float(ret1[1]) ss = re.sub('[\-]?\d+\.?\d*[\-+]\d+\.?\d*[^*+\-/)]', str(ret2), ss, 1) elif '-' in ret: if not ret.startswith('-'): ret1 = re.split('[\-]', ret) for i in range(ret1.count('')):ret1.remove('') ret2 = float(ret1[0]) - float(ret1[1]) ss = re.sub('[\-]?\d+\.?\d*[\-+]\d+\.?\d*[^*+\-/)]', str(ret2), ss, 1) else: return ss except: return ss def d90(ss):#去括号eg:(-10)===-10 while True: try: ret = re.search('\([\-]?\d+\.?\d+\)',ss).group() ret1 = re.split('[()]',ret) ret1.remove('') ret1.remove('') ss = re.sub('\([\-]?\d+\.?\d+\)',ret1[0],ss,1) except: return ss def jj(ss): while True: if '+-' in ss:ss = ss.replace('+-','-') elif '-+' in ss:ss = ss.replace('-+','-') elif '++' in ss:ss = ss.replace('++','+') elif '--' in ss:ss = ss.replace('--','+') else:return ss i = 0 # s = input('>>>').strip() s = s.replace(' ','') while i < 5: s = cpu_md(s) s = cpu_mdi(s) s = d90(s) s = jj(s) i += 1 # s = '2+2' print(s)