需求:求解有一个+_*/带括号的算式
解题思路
1.拆分计算括号.计算乘除.计算加减
2.利用正则表达式匹配出来需要计算的部分,结果替换掉原算式对应部分
3.最终返回一个计算加减乘除的结果
代码如下:`
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))
#print(atom_cal('3/5'))
#算出结果的表达式,会出现叠加的正负号
def format_exp(exp):
exp = exp.replace("--","+")
exp = exp.replace("-+","-")
exp = exp.replace("++","+")
exp = exp.replace("+-","-")
#print(exp)
return exp
def add_exp(exp):
ret = re.findall(r'[+-]?\d+(?:\.\d+)?',exp)#?:取消分组优先
#print(ret)
exp_sum = 0
for i in ret:
exp_sum += float(i)
return exp_sum
#先匹配出乘除的算式,计算出结果替换掉,变成纯加减法的算式
def mul_div_exp(exp):
while True:
ret = re.search (r'\d+(\.\d+)?[*/]-?\d+(\.\d+)?',exp)
if ret:
atom_exp = ret.group()
res = atom_cal(atom_exp)
#print(atom_exp,res)
exp = exp.replace(atom_exp,res)
#print(exp)
else:
return exp
def cal(exp):
exp = mul_div_exp(exp)
exp = format_exp(exp)
exp_sum = add_exp(exp)
return exp_sum
#print(cal('2-1*-22+5/-3+4*6'))
def main(exp):
exp=exp.replace(' ','')
#print(exp)
while 1:
ret = re.search(r'\([^()]+\)',exp)
if ret:
inner_bracket = ret.group()
res = str(cal(inner_bracket))
#print(inner_bracket,res)
exp = exp.replace(inner_bracket,res)
else:
return cal(exp)
if __name__ == '__main__':
s='(2-1*-22 + 5/-3+4 *6)* (2-1*-12+5 /-2 + 5*3) +34 /23-14*5'
print(main(s))
huibif的学习笔记