计算器

'''
计算简单的加减乘除,分5步走:
1.对整体的表达式去空格,用正则,筛选出没有括号的表达式
2.定义计算函数,去括号,用正则筛选出最小的乘除表达式,先计算乘除,后总的再计算加减
3.进行结果与表达式的替换,返回给调用者,得出一个新的表达式
4.去'+-''--'的换号
5.封装成一个一个函数,使用的是while循环
'''
import re #导入re模块
def delwith(express):    #处理连续的+-,或者--
    if '+-' in express:express = express.replace('+-','-')
    if '--' in express:express = express.replace('--','+')
    return express

def cal_exp_son(exp_son):           #处理最简单的原子表达式,两个数之间的乘除法
    if '*' in exp_son:
        a,b = exp_son.split('*')
        return str(float(a)*float(b))      # 由于此处式字符,不能直接计算,需要转义
    elif '/' in exp_son:
        a,b = exp_son.split('/')
        return str(float(a)/float(b))

def cal_express_no_bracket(exp):
    exp = exp.strip('()')
    #先计算乘除,后计算加减
    while 1:
        ret = re.search('\d+\.?\d*[*/]-?\d+\.?\d*',exp) #筛选最小的乘除表达式,注意的是*/后面的一定要带有-?这样才会选择出有负数的
        if ret:  # 说明表达式里面还有乘除号
            exp_son = ret.group()   # 得到最简单的表达式
            ret = cal_exp_son(exp_son)  # 计算最简单的表达式
            exp = exp.replace(exp_son,ret)
            exp = delwith(exp)    # 直到找不到乘除法   #因为一个表达式不可能仅有一个简单的数,还可能一个复杂的有+-,--的数,需要也要做整理
        else:  # 说明表达式没有乘除了
            ret = re.findall('-?\d+\.?\d*',exp)      #筛选出除了'+'号的所有数
            sum = 0
            for i in ret:
                sum += float(i)
            return str(sum)

def main(express):
    express = express.replace(' ', '')  # 去掉表达式里面的空格
    while 1:
        # 提取括号里面没有其他括号的表达式
        ret = re.search('\([^()]+\)',express)
        if ret:
            express_no_bracket = ret.group()
            ret = cal_express_no_bracket(express_no_bracket)  # 计算该表达式
            express = express.replace(express_no_bracket,ret)
            express = delwith(express)
        else:
            ret = cal_express_no_bracket(express)
            print(ret)
            break

express = '1 - 2 * ((6 0 - 3 0 + ( -40/5) * (9-2*5/3 + 7 /3*99/4*2998 + 10 * 568/14)) - (-4*3)/ (16-3*2))) '
main(express)
结果:2776672.6952380957
posted on 2018-11-14 10:47  smile大豆芽  阅读(151)  评论(0)    收藏  举报