意义
通过联系可以熟练掌握,正则表达式,循环,以及字符串操作。
业务流程
实现
#___author: laughing #date: 2018/7/3 import re a='1 - 2 * ( (60-30 +(-3+5+40*5*6+20*2/2) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )' def show_home(): print('请输入您要计算的算术表达式!') def str_test(scanf): def inner(): ret=scanf() tmp=re.search('[\d*/()+\-. ]+',ret) if tmp ==None: print('error !') return True, ret elif not ret.count('(')==ret.count(')'): print('error !') return True, ret else: tmp=tmp.group() if ret==tmp: return False,ret else: flag=True return flag,ret return inner def hadle_repeat(f): #去除空格 def inner(*ret): ret1=f(*ret) ret1 = ret1.replace(' ', '') ret1 = ret1.replace('+-', '-') ret1 = ret1.replace('--', '+') ret1 = ret1.replace('-+', '-') ret1 = ret1.replace('++', '+') ret1 = ret1.replace('*-', '+') ret1 = ret1.replace('e', '') return ret1 return inner @str_test @hadle_repeat def scanf(): st=input() return st @hadle_repeat def mut_div(ret): while True: tmp=re.search('\d+\.?\d*[*/]\d+\.?\d*',ret) #获得x*y if tmp != None: tmp=tmp.group() simple=re.search('[*/]',tmp).group() #获取*或者/的符号 tmp1=re.split('[*/]',tmp) #获得[x,y]的列表 tmp1[0]=float(tmp1[0]) #修改type tmp1[1]=float(tmp1[1]) if simple == '*': ind=str(tmp1[0]*tmp1[1]) ret=ret.replace(tmp,ind) else: ind=str(tmp1[0]/tmp1[1]) ret = ret.replace(tmp,ind) else: break return ret @hadle_repeat def add_sub(ret): while True: tmp=re.search('-?\d+\.?\d*[+-]\d+\.?\d*',ret) #获得x*y print(tmp) if tmp != None: tmp=tmp.group() print(tmp,type(tmp)) simple=re.findall('\d+.?\d*(\W)\d+.?\d*',tmp) #获取*或者/的符号 print(simple,type(simple)) tmp1=re.split('[+-]',tmp) #获得[x,y]的列表 print(tmp1,type(tmp1)) if tmp1[0]=='': del tmp1[0] if tmp[0]=='-': tmp1[0] = -float(tmp1[0]) tmp1[1] = float(tmp1[1]) else: tmp1[0]=float(tmp1[0]) #修改type tmp1[1]=float(tmp1[1]) if simple[0] == '+': ind=str(tmp1[0]+tmp1[1]) ret=ret.replace(tmp,ind) else: ind=str(tmp1[0]-tmp1[1]) ret = ret.replace(tmp,ind) else: break return ret flag=True #输入检测标志位,输入正确跳出,输入错误继续 while flag: show_home() flag,ret_code=scanf() print(ret_code) while re.search('\([^()]+\)',ret_code): ret1=re.search('\([^()]+\)',ret_code).group() #获得最里面的括号和值 ret=ret1.strip('()') #去掉括号 print(ret) ret = mut_div(ret) print(ret) ret = add_sub(ret) print(ret) ret_code=ret_code.replace(ret1,ret) print(ret_code) else: ret=mut_div(ret_code) print(ret) ret=add_sub(ret) print(ret)