python正则计算器(转)



原文:https://blog.csdn.net/qq_40794602/article/details/81738630 


import re
express = '(1 -2 *  (60-30+(-40/5)* (9-2*5/3+7 /3+99/4*2998)))'
express = '1+2*3+(3+4)'
#表达式:
def delwith(new_express):
    new_express = new_express.replace('+-','-')
    new_express = new_express.replace('--','+')
    return new_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 = exp.strip('()')
    # print(exp)
    #先乘除后加减
    while True:
        ret = re.search('\d+\.?\d*[*/]-?\d+\.?\d*',exp)
        if ret:
            exp_son = ret.group()
            # print(exp_son)
            ret = cal_exp_son(exp_son)
            # print(ret)
            exp = exp.replace(exp_son,ret)
            # print(new_express)
            # return exp
            exp = delwith(exp)
        else:
            ret = re.findall('-?\d+\.?\d*',exp)
            sum = 0
            for i in ret:
                sum += float(i)
            return str(sum)
#去空格:
new_express = express.replace(' ','')
# print(new_express)
 
#提取括号里面没有其他括号的表达式
while True:
    ret = re.search('\([^()]+\)',new_express)
    if ret:
        express_no_bracket = ret.group()
        # print(express_no_bracket)
        ret = cal_express_no_bracket(express_no_bracket)
        new_express = new_express.replace(express_no_bracket,ret)
        # print(new_express)
        new_express = delwith(new_express)
        # print(new_express)
    else:
        print("已经没有括号了:",new_express)
        new_express = cal_express_no_bracket(new_express)
        print("已经没有括号了:",new_express)
        break
 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值