要求:

首先得到一个字符串

去空格

找括号,且括号里没有其他括号

从左到右找到第一个乘除法

加减法

只剩一个数了,结束

############################################

import re


def cal_exp_son(exp_son):
#计算原子型表达式乘除法
if '/' in exp_son:
a,b = exp_son.split('/')
return str(float(a)/float(b))
elif '*' in exp_son:
a,b = exp_son.split('*')
return str(float(a)*float(b))


def clean(express):
#处理'+-'和'--'符号
express = express.replace('+-','-')
express = express.replace('--','+')
return express


def cal_express_clean(exp):
#计算没有括号的表达式
exp = exp.strip('()')
while 1:
ret = re.search('\d+\.?\d*[*/]-?\d+\.?\d*',exp)
if ret:
exp_son = ret.group()
ret = cal_exp_son(exp_son)
exp = exp.replace(exp_son,ret)
exp = clean(exp)
else:
ret = re.findall('-?\d+\.?\d*',exp)
sum = 0
for i in ret:
sum += float(i)
return str(sum)



def rm_bracket(new_express):
while 1:
ret = re.search('\([^()]+\)',new_express)
if ret:
express_clean = ret.group()
# express_clean = express_clean.strip('()')
ret1 = cal_express_clean(express_clean)
new_express = new_express.replace(express_clean,ret1)
new_express = clean(new_express)
print(new_express)
else:
ret = cal_express_clean(new_express)
return (ret)
break


express = '1 - 2*((60-30 +(-40/5)*(9-2*5/3+7 /3*99/4*2998 +10*568/14))- (-4*3)/(16-3/2))'
new_express = express.replace(' ','')
res = rm_bracket(new_express)
print(res)