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

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

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

  

posted @ 2016-09-15 13:38  Dwyane.wang  阅读(327)  评论(0编辑  收藏  举报