import re
def main():
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 = s.replace(" ","")
print(s)
print('s is ',eval(s))
while True:
li_s = re.findall('\([^()]+\)',s)
if li_s:
for i in li_s:
ret = str(calOneExp(i))
s = s.replace(i,ret)
else:
break
# while True:
# ret = re.search('\([^()]+\)',s)
# if ret:
# inner = ret.group()
# res = str(calOneExp(inner))
# s = s.replace(inner,res)
# else:
# break
#此时s 为没有任何括号的表达式
final_res = calOneExp(s)
print(final_res)
return final_res
def calAtomExp(exp):
'''
计算最小的表达式
:param exp:要计算的表达式
:return: 字符串型表达式结果
'''
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))
elif '+' in exp or '-' in exp:
lst_others = re.findall(r'[+-]?\d+(?:\.\d+)?',exp)
sum_others = 0
for i in lst_others:
try:
sum_others += float(i)
except Exception:
print('计算加减法时出现错误,请检查表达式是否合法')
break
return sum_others
def formatExp(exp):
exp = exp.replace('--','+')
exp = exp.replace('+-','-')
exp = exp.replace('++', '+')
exp = exp.replace('-+', '-')
return exp
def calMulDivExp(exp):
while True:
lst_res = re.findall('\d+(?:\.\d+)?[*/]-?\d+(?:\.\d+)?', exp)
if lst_res:
for atom_exp in lst_res:
mid_ret = calAtomExp(atom_exp)
exp = exp.replace(atom_exp, mid_ret)
else:
break
# 使用serch
#使用serch while 就能循环出整个的结果,如果一开始用findall,还是得使用while,否则将导致替换后的结果,无法正确被计算
# while True:
# one_result = re.search(r'\d+(\.\d+)?[*/]-?\d+(\.\d+)?',exp)
# if one_result:
# atom_exp = one_result.group()
# mid_ret = calAtomExp(atom_exp)
# #exp.replace( mid_ret,atom_exp)
# exp = exp.replace(atom_exp,mid_ret)
# else:
# break
return exp
def calAddSub(exp):
exp = formatExp(exp)
exp_sum = calAtomExp(exp)
return exp_sum
def calOneExp(exp):
'''
计算表达式内乘除法子项的结果
:param exp: 要计算的表达式
:return: 计算后的字符串型表达式
'''
exp = calMulDivExp(exp)
ret = calAddSub(exp)
return ret
#calOneExp('9-10.0/3+2.3333333333333335*24.75*2998+5680.0/14')
main()