正则实现计算器

import re
def jisuan(x):
    while True:
       if '*' in x  or '/' in x:                                                 #判断是否有乘法或者除法
           muber1 = re.search('\\-?\\d*\\.*\\d+[*/]\\-?\\d*\\.*\\d+',x).group()          #拿到第一个字符串,不知道是乘是除
           if '*' in muber1:                                                     #乘法逻辑
               numberla = re.split('\\*',muber1)
               qian1 =  numberla[0]
               hou2 = numberla[1]
               if '.' in qian1:                                                  #判断符号两边是否为小数
                   qian1_muber = float(numberla[0])
               else:
                    qian1_muber = int(numberla[0])
               if '.'in hou2:
                   hou2_muber = float(numberla[1])
               else:
                   hou2_muber = int(numberla[1])
               shuzi = qian1_muber*hou2_muber
               x = x.replace(muber1,str(shuzi))
           elif '/' in muber1:                                        #除法运算逻辑
                numberla = re.split('/',muber1)
                qian1 =  numberla[0]
                hou2 = numberla[1]
                if '.' in qian1:                                                  #判断符号两边是否为小数
                    qian1_muber = float(numberla[0])
                else:
                    qian1_muber = int(numberla[0])
                if '.'in hou2:
                    hou2_muber = float(numberla[1])
                else:
                    hou2_muber = int(numberla[1])
                shuzi = qian1_muber/hou2_muber
                x =x.replace(muber1,str(shuzi))                      #分的时候会出现小数而达不到取出完整的符号脸变得数
       elif '+' in x or re.findall('\\d\\-\\w+',x) != []:                                                         #乘除法消完了
               muber2 = re.search('\\-?\\d+\\.*\\d*[+\\-]\\-?\\d+\\.*\\d*',x).group()        #加减法
               if '+'in muber2:
                   numberla = re.split('\\+',muber2)
                   qian1 =  numberla[0]
                   hou2 = numberla[1]
                   if '.' in qian1:                                                  #判断符号两边是否为小数
                       qian1_muber = float(numberla[0])
                   else:
                       qian1_muber = int(numberla[0])
                   if '.'in hou2:
                        hou2_muber = float(numberla[1])
                   else:
                        hou2_muber = int(numberla[1])                                                                                     #加法运算逻辑
                   mubert = qian1_muber+hou2_muber
                   x = x.replace(muber2,str(mubert))
               elif '-' in muber2:                                   #减法运算逻辑
                   numberla = re.split('\\-',muber2)
                   qian1 =  numberla[0]
                   hou2 = numberla[1]
                   if '.' in qian1:                                                  #判断符号两边是否为小数
                       qian1_muber = float(numberla[0])
                   else:
                       qian1_muber = int(numberla[0])
                   if '.'in hou2:
                       hou2_muber = float(numberla[1])
                   else:
                       hou2_muber = int(numberla[1])
                   mubert = qian1_muber-hou2_muber
                   x = x.replace(muber2,str(mubert))
       else:
           x = re.findall('\\-?\\d+\\.?\\d*',x)[0]
           return(x)
def js(x):
    x = re.sub(' ','',x)
    if re.findall('[a-z]',x) != []:
        print('请检查你输入计算器的字符,里面有字母无法计算')
    elif re.findall('\\+\\++',x) != [] or re.findall('\\*\\*+',x) != [] or\
           re.findall('--+',x) != [] or re.findall('//+',x) != []:                 #都是判断带入的字符串是否符合规范
        print("请检查你的运算符是否输入有误")
    elif len(re.findall('\\(',x)) != len(re.findall('\\)',x)):
        print('请检查你括号是否写正确')
    else:                                                                          #没有括号直接调用逻辑函运算
        if re.findall('[()]',x) == []:
            myzhi = jisuan(x)
            return myzhi
        else:
            while True:                                                            #有括号循环计算消除括号
                muber1 = re.search('\\([^()]+\\)',x).group()
                x =x.replace(muber1,jisuan(muber1))
                if  re.findall('[()]',x) == []:                                    #消除所有括号,直接调用函数运算
                    myzhi =  jisuan(x)
                    return(myzhi)
a = '3*5*(1+4)-10/4+((3.5+1)/5-1)'
print(js(a))

猜你喜欢

转载自www.cnblogs.com/huangjianfir/p/13402448.html