zoukankan      html  css  js  c++  java
  • Python实例---利用正则实现计算器[FTL版]

    import re
    # 格式化
    def format_str(str):
        str = str.replace('--', '+')
        str = str.replace('-+', '-')
        str = str.replace('+-', '-')
        str = str.replace('*+', '*')
        str = str.replace('/+', '/')
        str = str.replace('++', '+')
        str = str.replace(' ', '')
    
    # 表达式检查
    def check_exp(str):
        ret = True
        # 匹配括号
        if not str.count('(') == str.count(')'):
            print("表达式错误,括号未闭合")
            ret = False
        if re.findall('[a-z]+', str.lower()):
            print('表达式错误,非法字符!!!')
            ret = False
        return ret
    
    
    # 计算乘除法 (30 + 6 * 2)
    def cal_mul_div(str):
        # 取出第一个乘法或者除法的表达式
        regular = 'd+.?d*([*/]|**)[-]?d+.?d*'
        while re.findall(regular, str):
            # 获取表达式
            expr = re.search(regular, str).group()
            # 计算乘法
            if expr.count('*') == 1:
                # 获取要计算的2个数字
                x, y = expr.split('*')
                # 计算乘法
                mul_result = str(float(x) * float(y))
                # 结果替换表达式
                str = str.replace(expr, mul_result)
                str = format_str(str)
            # 计算除法
            elif expr.count('/') == 1:
                # 获取要计算的2个数字
                x, y = expr.split('/')
                # 计算乘法
                div_result = str(float(x) / float(y))
                # 结果替换表达式
                str = str.replace(expr, div_result)
                str = format_str(str)
            # 计算幂次方
            elif expr.count('*') == 2:
                # 获取要计算的2个数字
                x, y = expr.split('*')
                # 计算幂次方
                pow_result = 1
                for i in range(int(y)):
                    pow_result *= int(x)
                # 结果替换表达式
                str = str.replace(expr, str(pow_result))
                str = format_str(str)
        return  str
    
    
    # 加减法运算
    def cal_div_sub(str):
        # 取出第一个乘法或者除法的表达式
        add_regular = '[-]?d+.?d*+[-]?d+.?d*'
        sub_regular = '[-]?d+.?d*-[-]?d+.?d*'
        # 计算加法
        add_list = re.findall(add_regular, str)
        for add_str in add_list:
            x, y = add_str.split('+')
            add_result = "+" + str(float(x) + float(y))
            str = str.replace()
            return str
        # 计算减法
        sub_list = re.findall(sub_regular, str)
        for sub_str in sub_list:
    
    if __name__ == '__main__':
        ss = '1 - 2 * ((60 - 30 + (-40/5) * (9 - 2 * 5 / 3 + 7 / 3 * 99 / 4 * 2998 + 10 * 568 / 14)) - (-4 * 3) / (16 - 3 * 2))'
        if check_exp(ss):
            print('Source:', ss)
            print('eval result:', eval(ss))
            ss = format_str(ss)
            print('Format result:', ss)
            # 判断是否右括号
            while ss.coumt('(') > 0:
                # 取出括号
                str = re.search('([^()]*)', ss).group()
                # 将括号的表达式进行乘法除法运算
                replace_str = cal_mul_div(str)
                # 将运算结果进行加法减法运算
                replace_str = cal_div_sub(replace_str)
                # 将括号的字符串替换为计算结果,结果包含(),替换时去掉():[1:-1]
                ss = format_str(ss.replace(str, replace_str[1:-1]))
            else:
                replace_str = cal_mul_div(ss)
                # 将运算结果进行加法减法运算
                replace_str = cal_div_sub(replace_str)
                # 将括号的字符串替换为计算结果,结果包含(),替换时去掉():[1:-1]
                ss = ss.replact(ss, replace_str)
            print("Final result:", ss.replace('+', ''))
     

    【更多参考】

    Python实例---利用正则实现计算器[参考版]

    Java实例---计算器实例

  • 相关阅读:
    穷人思维与富人思维
    纯真IP库读取文件
    memcached 分布式 一致性hash算法demo
    纯CSS画的基本图形(矩形、圆形、三角形、多边形、爱心、八卦等)
    IPhone在横屏字体变大解决办法-webkit-text-size-adjust
    js设计模式---阅读笔记002--接口
    js设计模式---阅读笔记001--富有表现力的js
    关于js继承
    js正则表达式中test,exec,match方法的区别说明
    js获取自定义的属性值
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9383431.html
Copyright © 2011-2022 走看看