• 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实例---计算器实例

  • 相关阅读:
    Neo4j ETL工具快速上手:简化从关系数据库到图数据库的数据迁移
    关于 Neo4j 属性个数的限制
    大数据、人工智能、知识图谱业务蓝图、技术架构-笔记
    数据库设计——评论回复功能
    搜索引擎和知识图谱那些事
    知识图谱在企业中的典型应用和注意事项
    这是一份通俗易懂的知识图谱技术与应用指南
    Qt实用技巧:使用QTableView、QSqlTableMode与QSqlDatabase对数据库数据进行操作
    Qt实用技巧:界面切换使用Dialog全屏切换
    pushbutton成为可点击的图标(实现全透明,不论点击与否都只显示Icon)(也就是一个万能控件)
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9383431.html
Copyright © 2020-2023  润新知