正则表达式之实战--计算器

# -*- coding: utf-8 -*-
import re
#本内容借鉴了别人的compile用法,我觉得这个用起来,代码比较简洁,明了

bk = re.compile(r'\([^()]+\)') # 寻找最内层括号规则
mul = re.compile(r'(\d+\.?\d*\*-\d+\.?\d*)|(\d+\.?\d*\*\d+\.?\d*)') # 寻找乘法运算规则
div = re.compile(r'(\d+\.?\d*/-\d+\.?\d*)|(\d+\.?\d*/\d+\.?\d*)') # 寻找除法运算规则
add = re.compile(r'(-?\d+\.?\d*\+-\d+\.?\d*)|(-?\d+\.?\d*\+\d+\.?\d*)') # 寻找加法运算规则
subt = re.compile(r'(-?\d+\.?\d*\-{2}\d+\.?\d*)|(-?\d+\.?\d*\-\d+\.?\d*)') # 寻找减法运算规则
remove = re.compile(r'[^(].*[^)]') # 脱括号规则

def cal_mul(s):
'''计算表达式中的乘法'''
sp = re.split(r'\*',mul.search(s).group())
result = str(float(sp[0]) * float(sp[1]))
return result

def cal_div(s):
'''计算表达式中的除法'''
sp = re.split(r'\/',div.search(s).group())
result = str(float(sp[0]) / float(sp[1]))
return result

def cal_add(s):
'''计算表达式中的加法'''
sp = re.split(r'\+',add.search(s).group())
result = re.sub(add,str(float(sp[0]) + float(sp[1])),s,count=1)
return result

def cal_subt(s):
'''计算表达式中的减法'''
sp = subt.search(s).group()
if sp.startswith('-'): #如果表达式是以-开头 -1-1
s1 = re.sub(r'\-','+',sp) #将-替换成+ +1+1
s2 = cal_add(s1) #调用加法 +2
s3 = re.sub(r'\++','-',s2) #将结果替换成- -2
result = re.sub(subt,s3,s,count=1)
else:
s1 = re.split(r'\-',sp)
result = re.sub(subt,str(float(s1[0]) - float(s1[1])),s,count=1)
return result

def main():
while True:
s = input("请输入计算公式(q退出) >>>>")
if s == "q":
exit()
else:
s = "".join([i for i in re.split('\s+',s)]) #将输入的表达式中空格去掉
if not s.startswith('(') or not s.endswith(')'): #判断输入是否在括号内
s = "(%s)"%s # 1+2 -->(1+2)
while bk.search(s): #判断s中是否有内层括号
s = re.sub(r'\-{2}','+',s) #如果表达式中含有-- --> + 例如:--2 --> +2
s1 = bk.search(s).group() #找到最内存括号
if div.search(s1): #判断s1中是否有除法
s2 = div.search(s1).group() #获得除法的表达式
s3 = s1.replace(s2,cal_div(s2)) #字符串替换
if re.search(r'\(\+?\-?\d+\.?\d*\)',s3): #判断s3是否为括号内的值 例如:(3)
s3 = remove.search(s3).group() #将值的括号去掉    (3) --> 3
s = s.replace(s1,s3) #将s中的s1替换为s3
elif mul.search(s1): #判断表达式中是否有乘法
s2 = mul.search(s1).group()
s3 = s1.replace(s2,cal_mul(s2))
if re.search(r'\(\+?\-?\d+\.?\d*\)',s3):
s3 = remove.search(s3).group()
s = s.replace(s1,s3)
elif subt.search(s1): #判断表达式中是否有减法
s2 = subt.search(s1).group()
s3 = s1.replace(s2,cal_subt(s2))
if re.search(r'\(\+?\-?\d+\.?\d*\)',s3):
s3 = remove.search(s3).group()
s = s.replace(s1,s3)
elif add.search(s1): #判断表达式中是否有加法
s2 = add.search(s1).group()
s3 = s1.replace(s2, cal_add(s2))
if re.search(r'\(\+?\-?\d+\.?\d*\)',s3):
s3 = remove.search(s3).group()
s = s.replace(s1,s3)
print("计算结果是:%s"%s)

if __name__ == '__main__':
main()
posted @ 2017-10-25 21:30  第七王爵  阅读(314)  评论(0编辑  收藏  举报