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了,醉了,先这样吧。。。。

原文地址:https://www.cnblogs.com/cokefentas/p/10134015.html