计算器作业(参考)

import re
def atom_cal(exp):
    if '*' in exp:  #计算单个乘法
        a, b = exp.split('*')

        return str(float(a)*float(b))
    elif '/' in exp:
        a, b = exp.split('/') #计算单个除法
        return str(float(a)/float(b))
def format_exp(exp):  #处理符号
    exp = exp.replace(' ', '') #处理空格
    exp = str(exp).replace('--', '+')
    exp = str(exp).replace('-+', '-')
    exp = str(exp).replace('+-', '-')
    exp = str(exp).replace('++', '+')
    return exp
def mul_div(exp): #筛选出乘除法
    while True:
        ret = re.search('-?d+(?:.d+)?[*/]-?d+(?:.d+)?', exp)
        if ret:
            atom_exp = ret.group()
            res = atom_cal(atom_exp) #计算乘除
            exp = exp.replace(atom_exp, res) #替换
        else: return exp  #乘除法算完了,返回原参数
def add_sub(exp): #计算加减法
    ret = re.findall('[+-]?d+(?:.d+)?', exp) #匹配带符号的数字,返回一个列表
    exp_sum = 0
    for i in ret:
        exp_sum += float(i)
    return exp_sum

def cal(exp): #计算加减乘除混合运算
    exp = mul_div(exp) #先算乘除
    exp = format_exp(exp) #处理符号
    exp_sum = add_sub(exp) #计算加减
    return str(exp_sum)

def main(exp):
    exp = exp.replace(' ', '') #删除空格
    while True:
        ret = re.search('([^()]*)', exp) #匹配括号
        if ret:
            inner_bracket = ret.group()
            # print(inner_bracket)
            res = cal(inner_bracket)  
            exp = exp.replace(inner_bracket, res) #替换
            exp = format_exp(exp)#处理符号
        else:
            break #没有括号跳出循环
    return cal(exp)
# s = '1 + 2+(2*3)+(4/2*3+1)+1+(1+(2*3/6-(-1+1)))'
# s = '1-2*((3+1)+1)'
s = '1-(2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))))'
    # '-(-4*3)/(16-3*2))'
# s = '1-2*3'
ret3 = main(s)
print(ret3)

  

一个奋斗中的产品小白
原文地址:https://www.cnblogs.com/dabai123/p/11399980.html