使用正则编写一个计算器
之前看到网上有很多网友在问正则表达式去编写计算器的代码,也有很多网友放出了自己的代码,所以利用空闲时间
自己也写了一个,时间匆忙可能代码有些小瑕疵不排除会有bug. 还是那句话进攻参考:import reunm="1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14) ) - (-4*3)/ (16-3*2) )"unm=unm.replace(" ","")def multiplication(unm2): #第一步去除括号 tag=True while tag: if re.search("\([^()]+\)+",unm2) and tag: ret=re.search("\([^()]+\)",unm2) #将括号过滤出来 ret1=ret.group() ret2=re.search("[^()]+",ret1) ret3=ret2.group() p=kuohao(ret3) #括号去除后交给乘除法函数 p=str(p) unm2=unm2.replace(ret1,p) else: p=kuohao(unm2) print(p) breakdef kuohao(k): #乘除法的运算 tag=True while tag: if re.search("(?:\d+)?\.?\d+?[*|/](\-|\+)?(?:\d+)?\.?(?:\d+)?",k) and tag: ret=re.search("(?:\d+)?\.?\d+?[*|/](\-|\+)?(?:\d+)?\.?(?:\d+)?",k) ret1=ret.group() if "/" in ret1: j=re.split("/",ret1) o=float(j[0])/float(j[1]) #运算的结果 o=str(o) k=k.replace(ret1,o) #将运算结果替换至未运算之前 elif "*" in ret1: j=re.split("\*",ret1) o=float(j[0])*float(j[1]) o=str(o) k=k.replace(ret1,o) else: add_subtract(k) return (add_subtract(k))def add_subtract(k): #加减法运算(最终的结果) tag=True while tag: k=re.sub("--","+",re.sub("\+\+","+",re.sub("-\+","-",re.sub("\+\-","-",k)))) #将重复的加减运算符替换 if re.search("(?:\d+)?\.?\d+?[-](?:\d+)?\.?(?:\d+)?",k) and tag: ret=re.search("(?:\d+)?\.?\d+?[-](?:\d+)?\.?(?:\d+)?",k) ret1=(ret.group()) j=re.split("\-",ret1) o=float(j[0])-float(j[1]) o=str(o) k=k.replace(ret1,o) elif re.search("(?:\d+)?\.?\d+?[+](?:\d+)?\.?(?:\d+)?",k) and tag: ret=re.search("(?:\d+)?\.?\d+?[+](?:\d+)?\.?(?:\d+)?",k) ret1=(ret.group()) j=re.split("\+",ret1) o=float(j[0])+float(j[1]) o=str(o) k=k.replace(ret1,o) else: return kmultiplication(unm)