• 函数加正则实现简单计算器


    本实现主要用到正则匹配的知识和函数的知识点完成一个能实现简单的加减乘除的计算器的运算

    import re
    
    #乘除运算
    def numl_mod(args):
        resurt  = re.compile('(d+.?d*)([*/])(-?d+.?d*)')#正则匹配,将匹配出来的结果赋给resurt
        while resurt.search(args):#while循环判断直到算出最终结果
            new_num = resurt.search(args)
            num = new_num.group()#取出原值赋给num
            num1 = float(new_num.group(1))
            num2 = new_num.group(2)#取出来的是 * / 号,在if 处进行判断
            num3 = float(new_num.group(3))
    
            if num2 == '*':
                result = num1 * num3#返回 * 的结果
            elif num2 == '/':
                result = num1 / num3#返回 / 的结果
            args = args.replace(num, str(result), 1)#将计算的结果替换返回
        return args
    # print(numl_mod("10*2/5"))
    
    # #加减运算
    def poor_add(args):
        resurt = re.compile('(-?d+.?d*)([-+])(-?d+.?d*)')
        while resurt.search(args):
            new_num = resurt.search(args)
            num = new_num.group()
            num1 = float(new_num.group(1))
            num2 = new_num.group(2)
            num3 = float(new_num.group(3))
            if num2 == '-':
                result = num1 - num3
            elif num2 == '+':
                result = num1 + num3
            args = args.replace(num, str(result), 1)
        return args
    
    # print(poor_add("3-5+6"))
    
    #检查判断去括号
    
    # origin = "1-2*((60-30+(-9-2-5-2*3-5/3-40*4/2-3/5+6*3)*(-9-2-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*25))"
    # origin = input("Enter number >>>>>")
    #检测式子的合法性
    def check(args):
        flag = True#默认标识位为真
        if re.findall("[a-zA-Z]",args):#检查式子的合法性,不能含有大小写字母
            print("error")
            flag = False
        return flag
    
    #检测运算
    def format(args):#检测式子,将 含有空格/++/+-/--等进行替换,返回一个新的式子
        new_args1 = args.replace("++", "+")
        new_args2 = new_args1.replace("+-", "-")
        new_args3 = new_args2.replace("--", "+")
        new_args4 = new_args3.replace("-+", "-")
        new_args5 = new_args4.replace(" ", "")
        new_args6 = new_args5.replace("*+","*")
        new_args = new_args6.replace("/+","/")
        return new_args
    
    print("--------------")
    print("欢迎使用计算机")
    print("--------------")
    #主代码块
    #执行语句块
    while True:
        choice = input("请选择 q/Q【退出】 y/Y 【执行】")
        if choice == "q" or choice == "Q":
            print("谢谢您的使用")
            break
        origin = input("Enter number >>>>>")
        if check(origin):
            new_origin = format(origin)
            while re.search("(",new_origin):#匹配如果有括号,执行下面代码
                new_new_origin = re.search("([^()]+)",new_origin).group()#匹配出最里面的括号里的式子
                # print(new_new_origin)
                s = numl_mod(new_new_origin)
                # print(s)
                s1 = poor_add(s)
                s2 = s1[1:-1]
                new_origin = new_origin.replace(new_new_origin, s2, 1)
                # print(new_origin)
                # print(s2, type(s2))
                # break
            else:#括号执行完后执行的代码块
                resurt = numl_mod(new_origin)
                # print(resurt, "resurt")
                # print(resurt)
                new_resurt = poor_add(resurt)
                # a2 = a2[1:-1]
                print(new_resurt)#返回的最终结果,也就是我们要得到的最终计算结果
    

      

  • 相关阅读:
    css 让div居中的代码
    纯Css实现两个Div占满整屏高度
    .net core api开发之从Postman发请求,接收不到参数值的问题记录
    win10下 IIS提示 处理程序“ExtensionlessUrlHandlerIntegrated4.0”在其模块列表中有一个错误模块“ManagedPipelineHandler”
    关于Linux fontconfig 字体库的坑
    前端性能优化方案,取自前端优化雅虎军规35条
    居中对齐
    sticky footer布局
    第30天 [js]写一个方法判断字符串是否为回文字符串
    第46天 [js] 写一个使两个整数进行交换的方法(不能使用临时变量)
  • 原文地址:https://www.cnblogs.com/flash55/p/5874717.html
Copyright © 2020-2023  润新知