模拟加减乘除,用正则和递归实现,效率有点低,主要目的是练习正则。
执行效果如下:
1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998+10 * 568/14 )) - (-4*3)/ (16-3*2) ) #原始计算公式
1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998+10 * 568/14 )) - (-4*3)/ (16-3*2) ) #原始计算公式
1-2*((60-30+-8.0*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2)) #提取(-40/5)进行计算,去除了所有的空白字符
1-2*((60-30+-8.0*173545.88095238098)-(-4*3)/(16-3*2)) #提取(9-2*5/3+7/3*99/4*2998+10*568/14)进行计算
1-2*(-1388337.0476190478-(-4*3)/(16-3*2)) #提取(60-30+-8.0*173545.88095238098)进行计算
1-2*(-1388337.0476190478--12.0/(16-3*2)) #提取(-4*3)进行处理
1-2*(-1388337.0476190478--12.0/10.0) #提取(16-3*2)进行处理
1-2*-1388335.8476190479 #提取(-1388337.0476190478--12.0/10.0)进行处理
2776672.6952380957 #最终结果,与计算器结果执行一致
1 #!/usr/bin/env python
2 #-*- coding:utf-8 -*-
3 #@Time : 2017/11/6 15:37
4 #@Author : lichuan
5 #@File : calcu.py
6
7
8 importre9 importtime10 #s='3 * 10+9/3+2 * 6'
11 #re.compile('[-+]')
12
13 #做乘法除法
14 defmul(strings):15 '''
16 乘法加法17 :param s:18 :return:19 '''
20 #print('this is add_del function')
21 pattern=re.compile('\d+\.?\d*[\*\/]+[-+]?\d+\.?\d*')22 match=pattern.search(strings)23 if notmatch:24 returnstrings25 s=match.group()26 if '*' ins:27 value1=s.split('*')[0]28 value2=s.split('*')[1]29 value=float(value1)*float(value2)30 elif '/' ins:31 value1 = s.split('/')[0]32 value2 = s.split('/')[1]33 value = float(value1) /float(value2)34 new_s=pattern.sub(str(value),strings,count=1)35 #print(new_s)
36 returnmul(new_s)37
38 #做加法减法
39 defadd_del(strings):40 #print('this is add_del function')
41 strings=clear(strings)42 pattern = re.compile('[-]?\d+\.?\d*\s*[-+]+\s*\d+\.?\d*')43 match =pattern.search(strings)44 if notmatch:45 returnstrings46 s=match.group()47 if '+' ins:48 value1 = s.split('+')[0]49 value2 = s.split('+')[1]50 value = float(value1) +float(value2)51 new_s = pattern.sub(str(value), strings, count=1)52 returnadd_del(new_s)53 elif '-' ins :54 if re.match('^-',s):55 value1 = s.split('-')[1]56 value2 = s.split('-')[2]57 value = -float(value1) -float(value2)58 else:59 value1 = s.split('-')[0]60 value2 = s.split('-')[1]61 value = float(value1) -float(value2)62 new_s = pattern.sub(str(value), strings, count=1)63 #print(new_s)
64 returnadd_del(new_s)65
66 #提取括号内容进行操作
67 defbrackets(strings):68 #print('this is brackets function')
69 print(strings)70 strings = re.sub('\s', '', strings)71 #strings=clear(strings)
72 pattern = re.compile('\([-]?\d+\.?\d*\s*([-+*/]*\s*\d+\.?\d*\s*){1,}\)')73 match =pattern.search(strings)74 if notmatch:75 s=mul(strings)76 r=add_del(s)77 returnr78 else:79 s=match.group()80 new_s=s.replace('(','')81 new_s=new_s.replace(')','')82 m_s=mul(new_s)83 a_s=add_del(m_s)84 #print(a_s)
85 #print(strings)
86 r=pattern.sub(a_s,strings,count=1)87 returnbrackets(r)88
89 #合并--、-+、+-、++等重复的运算符
90 defclear(strings):91 #print('this is clear function')
92 s=strings93 pattern_1 = re.compile('[-+]+[-+]+')94 m =pattern_1.search(strings)95 if notm:96 returnstrings97 else:98 strings=re.sub('--','+',s)99 strings=re.sub('-+','-',strings)100 strings=re.sub('\+\+','+',strings)101 strings=re.sub('\+\-','-',strings)102 returnclear(strings)103
104
105 if __name__ == '__main__':106 start=time.time()107 s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998+10 * 568/14 )) - (-4*3)/ (16-3*2) )'
108 print(s)109 b=brackets(s)110 print(b)111 end=time.time()