Python3 计算器作业(正则)

实现能计算类似
1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式的计算器程序

import re


def exp_format(exp):
    exp = exp.replace("--", "+")
    exp = exp.replace("+-", "-")
    exp = exp.replace("++", "+")
    exp = exp.replace("-+", "-")
    return exp


def cal_atom(exp):
    if '*' in exp:
        num1, num2 = exp.split("*")
        return str(float(num1) * float(num2))
    else:
        num1, num2 = exp.split("/")
        return str(float(num1) / float(num2))


def inner_bracket(exp, muldiv_re, addsub_re):
    """加减乘除运算"""
    while True:
        ret = muldiv_re.search(exp)
        if ret:
            ret = ret.group()
            res = cal_atom(ret)
            exp = exp.replace(ret, res)
        else:
            break
    exp = exp_format(exp)
    ret = addsub_re.findall(exp)
    count = 0
    for i in ret:
        count += float(i)

    return count


def remove_brackets(exp, bracket_re, muldiv_re, addsub_re):
    """优先计算最内层括号中的表达式"""
    while True:
        ret = bracket_re.search(exp)
        if ret:
            ret = ret.group()
            res = inner_bracket(ret, muldiv_re, addsub_re)
            exp = exp.replace(ret, str(res))
            exp = exp_format(exp)
        else:
            return exp


def main(exp):
    exp = exp.replace(" ", "")
    bracket_re = re.compile("\([^()]+\)")
    muldiv_re = re.compile(r"\d+(\.\d+)?[*/]-?\d+(\.\d+)?")
    addsub_re = re.compile("[-+]?\d+(?:\.\d+)?")
    exp = remove_brackets(exp, bracket_re, muldiv_re, addsub_re)
    return inner_bracket(exp, muldiv_re, addsub_re)


exp = '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(exp))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值