开发一个简单的python计算器

'''
开发一个简单的python计算器

实现加减乘除及拓号优先级解析
用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致


hint:

re.search(r'\([^()]+\)',s).group()

'(-40/5)'
'''


import re

# 匹配正数、负数、小数点
regex = re.compile(r'-?\d+\.?\d*')


# 加法减法
def plus_minus(s):
    # res = regex.search(s).group()
    while re.search(r'[+-]{2,}',s):
        s=s.replace('--','+')
        s=s.replace('++','+')
        s=s.replace('-+','-')
        s=s.replace('+-','-')

    list_digits = regex.findall(s)  # 匹配数字
    result = sum(map(float,list_digits))
    # s.replace(res,str(result))
    # print(s)
    result = str(result)
    # print(result)
    return result


# plus_minus('--3++4-+2+-1')

# 乘除法
def mul_div(s):
    while True:
        res = re.search(r'\d+\.?\d*[*/][\-+]?\d+\.?\d*', s)
        if res is not None:
            res = res.group()
            result = res
            if '*' in res:
                a,b = res.split('*')
                result = float(a)*float(b)
            elif '/' in res:
                a,b = res.split('/')
                result = float(a)/float(b)
            # print(result)
            result = str(result)
            s = s.replace(res,result)
        else:
            break

    return s

# print(mul_div('2/4*3/5'))


def main(s):
    s = s.replace(' ','')
    while True:
        res = re.search(r'\([^()]+\)',s)
        if res is not None:
            resu = res.group()    # 有括号 (1+2*3+4)
            result = mul_div(resu)
            result = plus_minus(result)
            # result = result[1:-1]
            s = s.replace(resu, result)
        else:
            s = mul_div(s)
            s = plus_minus(s)
            break
    return s



if __name__ == '__main__':
    equation = '1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'
    print(main(equation))











  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值