Python实例---对一组含有四则运算,括号,空格的字符串进行计算
'''实现能计算类似 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) 等类似公式的计算器程序'''
思路:
1,先用replace()替代掉所有空格
a = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )' a = a.replace(' ','')
2,利用正则表达式判断出所有的乘法除法运算,并返回计算好的结果到字符串中
def calcumultidiv(s): if re.search('\d+\.?\d*[*/]\d+\.?\d*',s): multidiv1 = re.findall('\d+\.?\d*[*/]\d+\.?\d*',s) # print(multidiv1) multidiv2 = [] for i in range(len(multidiv1)): if re.search('[*]',multidiv1[i]): x,y = re.split('[*]',multidiv1[i]) multidiv2.append(float(x)*float(y)) elif re.search('[/]',multidiv1[i]): x,y = re.split('[/]',multidiv1[i]) multidiv2.append(float(x)/float(y)) else: pass s = s.replace(multidiv1[i],str(multidiv2[i])) return calcumultidiv(s) else: return s print(calcumultidiv(a))
3,利用正则表达式判断出所有的加法减法运算,并返回计算好的结果到字符串中
def calcuaddsub(s): if re.search('\d+\.?\d*[+-]\d+\.?\d*',calcumultidiv(s)): addsub1 = re.findall('\d+\.?\d*[+-]\d+\.?\d*',calcumultidiv(s)) addsub2 = [] for i in range(len(addsub1)): if re.search('[+]',addsub1[i]): x,y = re.split('[+]',addsub1[i]) addsub2.append(float(x)+float(y)) elif re.search('[-]',addsub1[i]): x,y = re.split('[-]',addsub1[i]) addsub2.append(float(x)-float(y)) else: pass s = calcumultidiv(s).replace(addsub1[i],str(addsub2[i])) return calcuaddsub(s) else: return s print(calcuaddsub(a))
4,利用正则判断括号中是否只有一个计算好的数(如(-10)),如果是则去掉括号,并变换数字前符号
def rebra(s): if re.search('\([-]?\d+\.?\d*\)',calcuaddsub(s)): bra1 = re.findall('\([-]?\d+\.?\d*\)',calcuaddsub(s)) bra2 = [] for i in range(len(bra1)): x = bra1[i].replace('(','').replace(')','') bra2.append(x) s = calcuaddsub(s).replace(bra1[i],str(bra2[i])) return rebra(s) else: return s print(rebra(a))
def rerepeat(s): repeat = rebra(s) repeat = repeat.replace('+-','-').replace('--','+') return repeat print(rerepeat(a))
5,再次重复上边的过程,如果字符串中还含有四则运算符
def final(s): if re.search('\+|\-|\*|/',rerepeat(s)): fin = rerepeat(rebra(calcuaddsub(calcumultidiv(rerepeat(s))))) return fin else: return fin print(final(a))
这个嵌套把我自己都快搞糊了,搞了一天了代码还是存在问题,不能得出正确结果,并且如果含有类似(3-4*(5-8))的时候会先算3-4了,醉了,先这样吧。。。。