• re模块正则表达式的实际运用(计算器设计)


    import re
    def cal_atomexp(atom_exp):
        # 计算乘除法
        if '*' in atom_exp:
            a, b = atom_exp.split('*')
            return str(float(a) * float(b))
        elif '/' in atom_exp:
            a, b = atom_exp.split('/')
            return str(float(a) / float(b))
    
    def cal_muldiv(inner_bracket):
        while True:  # 计算括号里的所有乘除法
            ret = re.search('d+(.d+)?[*/]-?d+(.d+)?', inner_bracket)# 匹配第一个乘除法
            if not ret: break
            atom_exp = ret.group()  # 获取乘除法表达式  # 2*5
            atom_res = cal_atomexp(atom_exp)  # 计算乘除法的函数,得到结果  10.0
            inner_bracket = inner_bracket.replace(atom_exp, str(atom_res))
            # 将得到的结果与匹配到的表达式进行替换
        return inner_bracket  # 返回的是一个纯加减法组成的算式
    
    def cal_addsub(inner_bracket):
        # 计算括号中的所有加减法
        ret_l = re.findall('[-+]?d+(?:.d+)?', inner_bracket) # 找到所有的数字以及它前面的符号
        sum = 0
        for ret in ret_l:
            sum+=float(ret)
        return str(sum)
    
    def format_exp(exp):
        # 给表达式做格式化
        exp = exp.replace('--','+')
        exp = exp.replace('+-','-')
        exp = exp.replace('++','+')
        exp = exp.replace('-+','-')
        return exp
    
    def cal_bracket(exp): # 计算括号内的
        exp = cal_muldiv(exp)  # 括号内的 : 计算了所有乘除法,只剩下加减法的表达式
        exp = format_exp(exp)  # 计算完乘除法之后,会有一些符号问题,要替换掉所有++ -- -+ +-的情况
        return cal_addsub(exp) # 计算所有的加减法
    
    def main(s):   # s = 总表达式
        s = s.replace(' ', '') # 给总表达式s去空格,去掉空格之后s是没有空格的表达式
        while True:
            inner_bracket = re.search('([^()]+)', s) # 找最内层的小括号,得到一个对象
            if not inner_bracket: break  # 找不到小括号了就退出
            inner_bracket = inner_bracket.group() # 通过对象.group()得到一个内部没有小括号的表达式
            res = cal_bracket(inner_bracket) # 计算表达式
            s = s.replace(inner_bracket, res) # 用括号内的计算结果去替换匹配到的括号赋值给s
        return cal_bracket(s)
    
    s = '1-2*((60-30 +(9-2*5/3+7/3*99/4*2998+10*568/14)*(-40 / 5))-(-4*3)/(16-3*2))'
    print(main(s))  # 程序的总入口
    print(eval(s))

    总体思路就是先算最内层括号里的乘除,然后再算加减 ,通过对函数体的循环得到最终结果.

  • 相关阅读:
    从0到1构建适配不同端(微信小程序、H5、React-Native 等)的taro + dva应用
    一个基于Ionic3.x cordova的移动APP demo
    基于 MUI 构建一个具有 90 +页面的APP应用
    风清杨之Oracle的安装与说明
    浅析C#中的“==”和Equals
    window.open()的使用
    动态生成级联下拉框和多选框
    生成二维码的两种方式
    登录添加验证码校验
    oracle11g的安装以及配置
  • 原文地址:https://www.cnblogs.com/smile568968/p/9482630.html
Copyright © 2020-2023  润新知