要求
- 实现能计算类似
- 基础功能 加减乘除 a+b
- 进阶功能 a+b*c
- 更难的 带括号的
- 不许使用eval
1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2))
提示
- 正则表达式
- 先匹配 ()
- 先匹配 * /
- 再匹配 + -
1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
从上面算式中匹配出最内层小括号以及小括号内的表达式
\([^()]+\)
从类似9-2*5/3+7/3*99/4*2998+10*568/14的表达式中匹配出乘法或除法
\d+(\.\d+)?[*/]\d+(\.\d+)?
LowVer.
#!/usr/bin/env python
# encoding: utf-8
import re
def Mult_Divide(comput):
if '*' in comput:x,y = comput.split('*');return str(float(x) * float(y))
elif '/' in comput:x,y = comput.split('/');return str(float(x) / float(y))
def format_exp(exp):
exp = exp.replace('--','+');exp = exp.replace('+-','-')
exp = exp.replace('-+','-');exp = exp.replace('++','+')
return exp
Re_mudi = re.compile(r'\d+(\.\d+)?[*/]-?\d+(\.\d+)?')
def Res_MulDiv(comput):
while Re_mudi.search(comput):
ret = Re_mudi.search(comput)
comput = comput.replace(ret.group(),Mult_Divide(ret.group()),1)
return comput
Re_adde = re.compile(r'[+-]?\d+(?:\.\d+)?')
def Res_AdDe(comput,count=0):
for num in Re_adde.findall(comput):count += float(num)
comput = comput.replace(comput,str(count))
return comput
def Cal(comput):
res = Res_MulDiv(comput);res = format_exp(res);res = Res_AdDe(res)
return res
def main(comput):
while re.search('\([^()]+\)',comput):
inner = re.search('\([^()]+\)',comput).group()
res = Cal(inner)
comput = comput.replace(inner,res)
return Cal(comput)
print(main(input('Comput >>>').strip().replace(' ','')))