使用正则编写一个计算器
之前看到网上有很多网友在问正则表达式去编写计算器的代码,也有很多网友放出了自己的代码,所以利用空闲时间
自己也写了一个,时间匆忙可能代码有些小瑕疵不排除会有bug. 还是那句话进攻参考:
import re
unm="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)
break
def 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 k
multiplication(unm)