实现计算器功能
计算 1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
当遇见括号时先计算括号内,使用正则匹配括号,如果遇见乘除先算乘除,并以乘除或者加减为分隔符,把数值整进列表内。
递归计算,当计算完一个值后把这个值替换到最初的字符串内。
处理当遇到以负数开头或者“--”时,多写了一点。
当以负数开头时又定义了一个函数,当出现“--”时,则把--搞成+
第一版的结果有问题,没注意
1 #!/usr/bin/env python 2 # -*- encoding:utf-8 -*- 3 4 import re #导入正则模块 5 6 def tttt(data): #定义计算的函数 7 ‘‘‘ 8 调试的时候出现了“-”开头的东西,总是搞不掉,于是用if和正则多写了几个判断语句 9 这一段为正常不带负数的判断 10 之前是把最低下一段带有“-”的放在了上面,但是运行到-2+7*3这样的结构时,总是去先算加减,所以把“-”的仍到了下面 11 ‘‘‘ 12 if re.match(‘\d+\.?\d*[\+\-\*\/]+\d+\.?\d*‘,data): #如果匹配“正数字 加减乘除 数字”任何一中 13 if re.search(‘[\*\/]‘,data): #如果匹配乘除,为了先算乘除 14 aa = re.search(‘(\d+\.?\d*)[\*\/]([\+\-]*\d+\.?\d*)‘,data).group() 15 16 if re.search(‘/‘,aa): 17 wukuohaolist = aa.split(‘/‘) 18 print(wukuohaolist) 19 chujieguo = float(wukuohaolist[0]) / float(wukuohaolist[1]) 20 data = data.replace(aa,str(chujieguo)) 21 print(data) 22 return tttt(data) 23 if re.search(‘\*‘,aa): 24 wukuohaolist1 = aa.split(‘*‘) 25 print(wukuohaolist1) 26 chujieguo1 = float(wukuohaolist1[0]) * float(wukuohaolist1[1]) 27 data = data.replace(aa,str(chujieguo1)) 28 print(data) 29 return tttt(data) 30 else: 31 aa5 = re.search(‘(\d+\.?\d*)[\+\-]+([\*\/]*\d+\.?\d*)‘,data).group() 32 if re.search(‘\+‘,aa5): 33 wukuohaolist = aa5.split(‘+‘) 34 print(wukuohaolist) 35 chujieguo = float(wukuohaolist[0]) + float(wukuohaolist[1]) 36 data = data.replace(aa5,str(chujieguo)) 37 print(data) 38 return tttt(data) 39 if re.search(‘--‘,aa5): #计算时会出现减去一个负数的情况,减去一个负数这时侯为加上这个正数,所以当匹配“--”时,让他们去相加 40 wukuohaolist1 = aa5.split(‘--‘) #接上面,“--”和“-”匹配时有问题,所以把“-”扔到了“--”下面 41 print(wukuohaolist1) 42 chujieguo1 = float(wukuohaolist1[0]) + float(wukuohaolist1[1]) 43 data = data.replace(aa5,str(chujieguo1)) 44 print(data) 45 return tttt(data) 46 if re.search(‘\-‘,aa5): 47 wukuohaolist1 = aa5.split(‘-‘) 48 print(‘vvcc‘,wukuohaolist1) 49 chujieguo1 = float(wukuohaolist1[0]) - float(wukuohaolist1[1]) 50 data = data.replace(aa5,str(chujieguo1)) 51 print(data) 52 return tttt(data) 53 54 else: 55 return data 56 57 #以下为第二大段,当匹配到“-1*2+3”这样的结构时使用 58 if re.search(‘\-\d+\.?\d*[\*\/]+\d+\.?\d*‘,data): 59 if re.search(‘\-\d+\.?\d*[\*]\d+\.?\d*‘,data): 60 aatest1 = re.search(‘\-\d+\.?\d*[\*]\d+\.?\d*‘,data).group() 61 print(aatest1) 62 63 wukuohaolist1111 = aatest1.split(‘*‘) 64 jisuan1 = float(wukuohaolist1111[0]) * float(wukuohaolist1111[1]) 65 print(jisuan1) 66 print(wukuohaolist1111) 67 data = data.replace(aatest1,str(jisuan1)) 68 return tttt(data) 69 70 71 else: 72 aatest = re.search(‘\-\d+\.?\d*[\/]\d+\.?\d*‘,data).group() 73 print(aatest) 74 wukuohaolist111 = aatest.split(‘/‘) 75 jisuan = float(wukuohaolist111[0]) / float(wukuohaolist111[1]) 76 print(wukuohaolist111) 77 print(jisuan) 78 data = data.replace(aatest,str(jisuan)) 79 return tttt(data) 80 81 82 if re.search(‘\-\d+\.?\d*[\+\-]+\d+\.?\d*‘,data): 83 84 if re.search(‘\-\d+\.?\d*^[\-\-]\d+\.?\d*‘,data): 85 aatest1 = re.search(‘\-\d+\.?\d*[\-\-]\d+\.?\d*‘,data).group() 86 wukuohaolist12 = aatest1.split(‘--‘) 87 print(‘mmmmmmm‘,wukuohaolist12) 88 chujieguo12 = float(wukuohaolist12[0]) + float(wukuohaolist12[1]) 89 data = data.replace(aatest1,str(chujieguo12)) 90 print(data) 91 return tttt(data) 92 93 if re.search(‘\-\d+\.?\d*[\-]\d+\.?\d*‘,data): 94 aatest1 = re.search(‘\-\d+\.?\d*[\-]\d+\.?\d*‘,data).group() 95 print(aatest1) 96 97 wukuohaolist1111 = aatest1.split(‘-‘) 98 jisuan1 = -(float(wukuohaolist1111[1]) + float(wukuohaolist1111[2])) 99 print(jisuan1) 100 print(wukuohaolist1111) 101 data = data.replace(aatest1,str(jisuan1)) 102 return tttt(data) 103 104 105 if re.search(‘\-\d+\.?\d*[\+]\d+\.?\d*‘,data): 106 aatest = re.search(‘\-\d+\.?\d*[\+]\d+\.?\d*‘,data).group() 107 print(aatest) 108 wukuohaolist111 = aatest.split(‘+‘) 109 jisuan = float(wukuohaolist111[0]) + float(wukuohaolist111[1]) 110 print(wukuohaolist111) 111 print(jisuan) 112 data = data.replace(aatest,str(jisuan)) 113 return tttt(data) 114 115 #定义去除括号函数 116 def kuohao(daa): 117 if re.search(‘\(.+\)‘,daa): 118 kuohaodata = re.search(‘\([^()]+\)‘,daa).group() 119 print(‘kuohaodata‘,kuohaodata) 120 wukuohao = kuohaodata.strip(‘\(\)‘) 121 122 aa3 = tttt(wukuohao) 123 print(‘aa3‘,aa3) 124 aa4 = daa.replace(kuohaodata,str(aa3)) 125 print(aa4) 126 else: 127 return tttt(daa) 128 return kuohao(aa4) 129 130 if __name__ == ‘__main__‘: 131 print("输入以下内容:") 132 print(‘1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))‘) 133 daa = input(‘输入要计算的内容:‘) 134 daa = re.sub(‘\s*‘,‘‘,daa) 135 # daa = ‘1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))‘ 136 137 kuohao(daa)
第二版修改一切正常
1 #!/usr/bin/env python 2 # -*- encoding:utf-8 -*- 3 4 import re #导入正则模块 5 6 def tttt(data): #定义计算不带开头不带负数的函数 7 ‘‘‘ 8 9 这一段为正常不带负数的判断 10 计算的结果和事实不符,在第一版内去除括号计算时,到最后没有计算括号内的,而是直接脱去了括号和外面的相乘去了,于是把第一版的第二大段换成了函数,另加了一个函数做判断 11 1-2*(-1388337.0476190478--4*3/10.0) 12 kuohaodata (-1388337.0476190478--4*3/10.0) 13 aa3 -1388337.0476190478--4*3/10.0 14 1-2*-1388337.0476190478--4*3/10.0 15 [‘2‘, ‘-1388337.0476190478‘] 16 1--2776674.0952380956--4*3/10.0 17 ‘‘‘ 18 if re.match(‘\d+\.?\d*[\+\-\*\/]+\d+\.?\d*‘,data): #如果匹配“正数字 加减乘除 数字”任何一中 19 if re.search(‘[\*\/]‘,data): #如果匹配乘除,为了先算乘除 20 aa = re.search(‘(\d+\.?\d*)[\*\/]([\+\-]*\d+\.?\d*)‘,data).group() 21 22 if re.search(‘/‘,aa): 23 wukuohaolist = aa.split(‘/‘) 24 print(wukuohaolist) 25 chujieguo = float(wukuohaolist[0]) / float(wukuohaolist[1]) 26 data = data.replace(aa,str(chujieguo)) 27 print(data) 28 return tttt(data) 29 if re.search(‘\*‘,aa): 30 wukuohaolist1 = aa.split(‘*‘) 31 print(wukuohaolist1) 32 chujieguo1 = float(wukuohaolist1[0]) * float(wukuohaolist1[1]) 33 data = data.replace(aa,str(chujieguo1)) 34 print(data) 35 return tttt(data) 36 else: 37 aa5 = re.search(‘(\d+\.?\d*)[\+\-]+([\*\/]*\d+\.?\d*)‘,data).group() 38 if re.search(‘\+‘,aa5): 39 wukuohaolist = aa5.split(‘+‘) 40 print(wukuohaolist) 41 chujieguo = float(wukuohaolist[0]) + float(wukuohaolist[1]) 42 data = data.replace(aa5,str(chujieguo)) 43 print(data) 44 return tttt(data) 45 if re.search(‘--‘,aa5): #计算时会出现减去一个负数的情况,减去一个负数这时侯为加上这个正数,所以当匹配“--”时,让他们去相加 46 wukuohaolist1 = aa5.split(‘--‘) #接上面,“--”和“-”匹配时有问题,所以把“-”扔到了“--”下面 47 print(wukuohaolist1) 48 chujieguo1 = float(wukuohaolist1[0]) + float(wukuohaolist1[1]) 49 data = data.replace(aa5,str(chujieguo1)) 50 print(data) 51 return tttt(data) 52 if re.search(‘\-‘,aa5): 53 wukuohaolist1 = aa5.split(‘-‘) 54 print(‘vvcc‘,wukuohaolist1) 55 chujieguo1 = float(wukuohaolist1[0]) - float(wukuohaolist1[1]) 56 data = data.replace(aa5,str(chujieguo1)) 57 print(data) 58 return tttt(data) 59 60 else: 61 return data 62 63 #以下为第二大段,当匹配到“-1*2+3”这样的结构时使用 。第二个函数 64 def tttt2(data): 65 if re.match(‘\-\d+\.?\d*[\+\-\*\/]+\d+\.?\d*‘,data): #如果匹配“正数字 加减乘除 数字”任何一中 66 if re.search(‘[\*\/]‘,data): #如果匹配乘除,为了先算乘除 67 aaa = re.search(‘(\-\d+\.?\d*)[\*\/]([\+\-]*\d+\.?\d*)‘,data).group() 68 69 if re.search(‘/‘,aaa): 70 wukuohaolist = aaa.split(‘/‘) 71 print(wukuohaolist) 72 chujieguo = float(wukuohaolist[0]) / float(wukuohaolist[1]) 73 data = data.replace(aaa,str(chujieguo)) 74 print(data) 75 return tttt2(data) 76 if re.search(‘\*‘,aaa): 77 wukuohaolist1 = aaa.split(‘*‘) 78 print(wukuohaolist1) 79 chujieguo1 = float(wukuohaolist1[0]) * float(wukuohaolist1[1]) 80 data = data.replace(aaa,str(chujieguo1)) 81 print(data) 82 return tttt2(data) 83 else: 84 aaa5 = re.search(‘(\-\d+\.?\d*)[\+\-]+([\*\/]*\d+\.?\d*)‘,data).group() 85 if re.search(‘\+‘,aaa5): 86 wukuohaolist = aaa5.split(‘+‘) 87 print(wukuohaolist) 88 chujieguo = float(wukuohaolist[0]) + float(wukuohaolist[1]) 89 data = data.replace(aaa5,str(chujieguo)) 90 print(data) 91 return tttt2(data) 92 if re.search(‘--‘,aaa5): #计算时会出现减去一个负数的情况,减去一个负数这时侯为加上这个正数,所以当匹配“--”时,让他们去相加 93 wukuohaolist1 = aaa5.split(‘--‘) #接上面,“--”和“-”匹配时有问题,所以把“-”扔到了“--”下面 94 print(wukuohaolist1) 95 chujieguo1 = float(wukuohaolist1[0]) + float(wukuohaolist1[1]) 96 data = data.replace(aaa5,str(chujieguo1)) 97 print(data) 98 return tttt2(data) 99 if re.search(‘\-‘,aaa5): 100 wukuohaolist1 = aaa5.split(‘-‘) 101 print(‘jianjianjinjian‘,wukuohaolist1) 102 chujieguo1 = float(wukuohaolist1[1]) + float(wukuohaolist1[2]) 103 data = data.replace(aaa5,str(-chujieguo1)) 104 print(data) 105 return tttt2(data) 106 107 else: 108 return data 109 110 #另加的函数 111 112 def jiaygie(data): 113 if re.match(‘\d+\.?\d*[\+\-\*\/]+\d+\.?\d*‘,data): 114 # tttt(data) 115 return tttt(data) 116 elif re.match(‘\-\d+\.?\d*[\+\-\*\/]+\d+\.?\d*‘,data): 117 # tttt2(data) 118 return tttt2(data) 119 else: 120 return data 121 #去除括号的函数 122 123 def kuohao(daa): 124 if re.search(‘\(.+\)‘,daa): 125 kuohaodata = re.search(‘\([^()]+\)‘,daa).group() 126 print(‘kuohaodata‘,kuohaodata) 127 wukuohao = kuohaodata.strip(‘\(\)‘) 128 129 aa3 = jiaygie(wukuohao) 130 print(‘aa3‘,aa3) 131 aa4 = daa.replace(kuohaodata,str(aa3)) 132 print(aa4) 133 else: 134 return jiaygie(daa) 135 return kuohao(aa4) 136 137 if __name__ == ‘__main__‘: 138 print("输入以下内容:") 139 print(‘1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))‘) 140 daa = input(‘输入要计算的内容:‘) 141 daa = re.sub(‘\s*‘,‘‘,daa) 142 # daa = ‘1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))‘ 143 144 kuohao(daa)
原文:http://www.cnblogs.com/dribs/p/5197855.html