zoukankan      html  css  js  c++  java
  • 函数加正则实现简单计算器

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

    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)#返回的最终结果,也就是我们要得到的最终计算结果
    

      

  • 相关阅读:
    「Luogu」2831愤怒的小鸟 (DFS+dp)
    LeetCode习题集
    递归的时间复杂度你真的懂吗?不是所有的二分递归都是logn级别
    [数据结构篇]谈一谈优先队列吧!
    论文爱好者(我不是)的福利
    Python 读微博留言进行情感分析(文本分类)
    python 多进程中的p.apply_async()
    记录本科论文开题报告修改过程
    KMP字符串匹配算法
    Pandas Timedelta
  • 原文地址:https://www.cnblogs.com/flash55/p/5874717.html
Copyright © 2011-2022 走看看