本文编写一个计算机程序,为了熟悉正则表达式,所以不用eval的方式,而是直接匹配运算符号进行运算。
计算式子例如:1-2*((60-30+(-40.0/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
此程序核心算法是递归表达式,计算此算式的架构图如下(仅供参考):
下面开始进行编程:
首先先定义所需要进行的操作,比如先算乘除算法再算加减算法,有括号的先计算括号里面的内容。
先定义乘除的算法:
import re
def cheng(c):
if re.search(\'\d{1,}(\.\d{1,})?[\*\/]\d{1,}(\.\d{1,})?\',c)==None:
return c
else:
i=re.search(\'\d{1,}(\.\d{1,})?[\*\/]\d{1,}(\.\d{1,})?\',c).group()
j=re.findall(\'[^\d.]\',i)
k=0
b=i.split(j[0])
if j[0]==\'*\':
k=float(b[0])*float(b[1])
elif j[0]==\'/\':
k=float(b[0])/float(b[1])
t=str(k)
d=c.split(i)
c=\'%s%s%s\'%(d[0],t,d[1])
d=cheng(c) #递归调用
return d
再定义加减的算法:
def jia(c):
if re.search(\'\d{1,}(\.\d{1,})?[\+\-]{1,}\d{1,}(\.\d{1,})?\',c)==None:
return c #没有加减直接返回原字符串
else:
i=re.search(\'\d{1,}(\.\d{1,})?[\+\-]{1,}\d{1,}(\.\d{1,})?\',c).group()
j=re.findall(\'[^\d.]\',i)
k=0
b=i.split(j[0])
if (j[0]==\'+\'):
k=float(b[0])+float(b[1])
elif (j[0]==\'-\'):
k=float(b[0])-float(b[1])
t=str(k)
d=c.split(i)
c=\'%s%s%s\'%(d[0],t,d[1])
#print(c)
d=jia(c) #递归调用
return d
如果出现了(20.33)等类似的情况,则需要将括号去掉:
def kuohao(c):
if re.search(\'\(\-?\d*(\.\d*)?\)\',c)==None:
return c
e=re.search(\'\(\-?\d*(\.\d*)?\)\',c).group()
#print(e)
f=re.search(\'\-?\d{1,}(\.\d{1,})?\',e).group()
#print(f)
g=c.split(e)
c=\'%s%s%s\'%(g[0],f,g[1])
#print(c)
m=kuohao(c) #递归调用
return m
有时在去括号之后可能会出现*-或/-这种情况,因为括号之内的数字可能是小数,比如2*(-40/8),所以针对这种情况需要处理一下:
def cheng_jian(b):
if re.search(\'\d{1,}(\.\d{1,})?[\*\/]\-\',b)==None:
return b
c=re.search(\'\d{1,}(\.\d{1,})?[\*\/]\-\',b).group()
e=b.split(c)[0]
g=b.split(c)[1]
d=c.split(\'-\')[0]
h=\'%s%s\'%(\'-\',d)
b=\'%s%s%s\'%(e,h,g)
#print(b)
f=cheng_jian(b)
return f
定义好这些函数后就可以写对真个算式进行计算的函数啦:
def kuohao1(b):
if re.search(\'\(\-{0,}\d{1,}(\.\d{1,})?([\*\-\+\/]{1,}\d{1,}(\.\d{1,})?){1,}\)\',b)==None:
b = b.replace(\'+-\', \'-\') #+-和-同义
b = b.replace(\'--\', \'+\') #--等于+
b=cheng_jian(b)
m=cheng(b)
n=jia(m)
return n
c=re.search(\'\(\-{0,}\d{1,}(\.\d{1,})?([\*\-\+\/]{1,}\d{1,}(\.\d{1,})?){1,}\)\',b).group()
zhi=cheng(c) #先算乘除,再算加减
zhi2=jia(zhi)
d=b.split(c)[0]
e=b.split(c)[1]
k=\'%s%s%s\'%(d,zhi2,e)
b=kuohao(k) #去括号
b=b.replace(\'+-\',\'-\')
b=b.replace(\'--\',\'+\')
b=cheng_jian(b)
#print(b)
e=kuohao1(b) #递归调用,直到算出一个结果
e = e.replace(\'+-\', \'-\')
e = e.replace(\'--\', \'+\')
e = cheng_jian(e)
m = cheng(e)
n = jia(m)
return n #返回最后的结果
然后用户自定义一个字符串,并将参数值传给kuohao1就完成了:
a=input(\'请输入算式:\')
if re.search(\'[^\d\(\)\+\-\*\/]\',a)!=None: #对输入做一个判断
print(\'输入表达式有误!\')
else:
print(kuohao1(a))
测试: