本文编写一个计算机程序,为了熟悉正则表达式,所以不用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))
测试: