python3 运用正则实现计算器

import re

bracket = 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*)') # 寻找加法运算规则
sub = re.compile(r'(-?\d+\.?\d*--\d+\.?\d*)|(-?\d+\.?\d*-\d+\.?\d*)') # 寻找减法运算规则
c_f = re.compile(r'\([^*/]\)') # 检查括号内是否运算完毕规则
strip = re.compile(r'[^(].*[^)]') # 脱括号规则
n_md = re.compile('\([^*/]+\)') # 一个括号里面没有乘除 那么只会有数字与加减
res = re.compile('([+-]?\d+\.?\d*)')
ills= re.compile(r'[^0-9*/+\-\(\)]')

def Mul(exp):
result = re.split(r'\*',mul.search(exp).group())
return exp.replace(mul.search(exp).group(),str(float(result[0])*float(result[1])))

def Div(exp):
result = re.split(r'/', div.search(exp).group())
return exp.replace(div.search(exp).group(), str(float(result[0])/ float(result[1])))

def Add_Sub(exp):
exp = exp.replace('++','+')
exp = exp.replace('+-','-')
exp = exp.replace('--','+')
exp = exp.replace('-+','-')
# print(exp)
nums = re.findall('[+\-]?\d+\.?\d*',exp)
count = 0
for num in nums:
count += float(num)
return str(count)

# 添加用户输入判断
def calculator():
while True:
exp = input('>>>')
round_num = input('请输入保留位数,输入为空不保留:')
if exp.strip().upper() == 'Q':
print('退出程序')
exit()
else:
try:
round_num = None if round_num.strip() == '' else int(round_num)
except Exception as e:
print(e)
print('输入非法,不保留小数位')
round_num =None

exp = exp.replace(' ','')
if ills.search(exp):
print('有非法字符!')
else:
while bracket.search(exp):
result = bracket.search(exp).group()
# print(result)
if div.search(result):
exp = exp.replace(result,Div(result))
elif mul.search(result):
exp = exp.replace(result,Mul(result))
elif n_md.search(result): # 将括号里面的内容做加减运算,得到的结果然后替换整个括号
# exp = exp.replace(n_md.search(result).group(),Add_Sub(result))
exp = exp.replace(result, Add_Sub(result))
print(exp)
# 没有括号了,操作整个表达式,先算乘除,再算加减
while True:
if div.search(exp):
result = div.search(exp).group()
exp = exp.replace(result,Div(result))
elif mul.search(exp):
result = mul.search(exp).group()
exp = exp.replace(result,Mul(result))
else:
result = Add_Sub(exp)
# print('The answer is: %.2f'%float(result))

print('The answer is: {}'.format(round(float(result),round_num)))
break
calculator()
# print(1-2*((60-30+(-40/-5+20/4+3*4*5/2)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))-99*2)
# print(69*(69+1)*100+2*8)

 

posted @ 2018-10-16 12:19  Woowo  阅读(209)  评论(0)    收藏  举报