import re
def atom_cal(exp):
if '*' in exp: #计算单个乘法
a, b = exp.split('*')
return str(float(a)*float(b))
elif '/' in exp:
a, b = exp.split('/') #计算单个除法
return str(float(a)/float(b))
def format_exp(exp): #处理符号
exp = exp.replace(' ', '') #处理空格
exp = str(exp).replace('--', '+')
exp = str(exp).replace('-+', '-')
exp = str(exp).replace('+-', '-')
exp = str(exp).replace('++', '+')
return exp
def mul_div(exp): #筛选出乘除法
while True:
ret = re.search('-?\d+(?:\.\d+)?[*/]-?\d+(?:\.\d+)?', exp)
if ret:
atom_exp = ret.group()
res = atom_cal(atom_exp) #计算乘除
exp = exp.replace(atom_exp, res) #替换
else: return exp #乘除法算完了,返回原参数
def add_sub(exp): #计算加减法
ret = re.findall('[+-]?\d+(?:\.\d+)?', exp) #匹配带符号的数字,返回一个列表
exp_sum = 0
for i in ret:
exp_sum += float(i)
return exp_sum
def cal(exp): #计算加减乘除混合运算
exp = mul_div(exp) #先算乘除
exp = format_exp(exp) #处理符号
exp_sum = add_sub(exp) #计算加减
return str(exp_sum)
def main(exp):
exp = exp.replace(' ', '') #删除空格
while True:
ret = re.search('\([^()]*\)', exp) #匹配括号
if ret:
inner_bracket = ret.group()
# print(inner_bracket)
res = cal(inner_bracket)
exp = exp.replace(inner_bracket, res) #替换
exp = format_exp(exp)#处理符号
else:
break #没有括号跳出循环
return cal(exp)
# s = '1 + 2+(2*3)+(4/2*3+1)+1+(1+(2*3/6-(-1+1)))'
# s = '1-2*((3+1)+1)'
s = '1-(2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))))'
# '-(-4*3)/(16-3*2))'
# s = '1-2*3'
ret3 = main(s)
print(ret3)