zoukankan      html  css  js  c++  java
  • 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了,醉了,先这样吧。。。。

  • 相关阅读:
    剑指offer-序列化二叉树
    剑指offer-把字符串转换成整数
    CentOS终端账户切换
    bootstrap3 modal居中
    海洋地理信息系统的应用现状及其发展趋势
    智慧城市八大应用,助力城市更加智慧
    zTree触发节点click,check事件
    Linux Centos下软件的安装与卸载方法
    MongoDB系列教程大全
    openlayers加载切片错位解决方案
  • 原文地址:https://www.cnblogs.com/cokefentas/p/10134015.html
Copyright © 2011-2022 走看看