zoukankan      html  css  js  c++  java
  • 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))

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

  • 相关阅读:
    (10)C#静态方法,静态字段,静态类,匿名类
    (9)C#类
    (8)C#字符串
    (7)C#流程控制
    (6)C#方法,作用域,方法重载
    (5)C#运算符
    各个品牌主板快速开机启动
    口袋的天空
    繁忙的都市
    取水
  • 原文地址:https://www.cnblogs.com/smile568968/p/9482630.html
Copyright © 2011-2022 走看看