import re
def silmple_cal(mul_div): #乘法或除法计算函数
if '/' in mul_div: #如果‘/’在这个计算式里面
val1,val2 = mul_div.split('/')
ret_val = float(val1)/float(val2)
return ret_val #返回除法计算结果
elif '*' in mul_div: #如果乘法在计算式里面
val1, val2 = mul_div.split('*')
ret_val = float(val1) * float(val2)
return ret_val #返回除法计算结果
def modify_express(express):
express = express.replace('--',' ')
express = express.replace('- ','-')
express = express.replace(' -','-')
express = express.replace(' ',' ')
return express
def express_cal(express_new):
# 没有括号的表达式的计算
no_bracket_express = express_new.strip('()') #将传进来的小括号去掉
while re.search(r'\d \.?\d*[*/]\-?\d \.?\d*', no_bracket_express): #当这个计算式里面含有*或者除号的时候,
ret_mul_div = re.search(r'\d \.?\d*[*/]\-?\d \.?\d*', no_bracket_express) #取到计算式里的第一个乘法或除法
mul_div = ret_mul_div.group() #取到计算式里的第一个乘法或除法
ret_val = silmple_cal(mul_div) #调用silmple_cal函数,并将这个除法或乘法传进去,并拿到它的返回值,拿到的是一个数
no_bracket_express = no_bracket_express.replace(mul_div, str(ret_val), 1) #将已经去掉括号的计算式里的第一个乘法或除法替换为它的结果,并只替换最前面的一次
no_bracket_express = modify_express(no_bracket_express)#调用 modify_express函数,并将结果传进去,得到一个正确的计算式
ret_lst = re.findall(r'[ \-]?\d \.?\d*', no_bracket_express) #将已经没有乘除法的计算式里面的正负数取出来得到一个列表
if ret_lst: #如果这个列表不为空,表示计算式里面含有加减法,要进行加减法计算
total = 0
for item in ret_lst:
total = float(item)
return total #返回最终结果
return no_bracket_express #如果没有走if语句说明里面没有加减法,将乘除法的结果返回即可
#去括号
def remove_bracket(s): #s= 'a1-2*((60-30 (-40/5)*(9-2*5/3 7/3*99/4 *2998 10* 568/14))-(-4*3)/(16-3*2))' #将计算式去除括号,并返回最终计算结果
while re.search(r'\([^()] \)',s): #当计算式里还含有小括号时,表示search能拿到值,不为空
express_new = re.search(r'\([^()] \)',s).group() #拿到第一个最里层的括号内的东西
ret_val = express_cal(express_new) #开始调用express_cal函数,将取到的第一小括号传进去,并拿到第一个小括号的计算总结果,
express = s.replace(express_new,str(ret_val)) #将计算式第一个括号替换为总结果
s = modify_express(express)#整理算式中的 -号
ret = express_cal(s)
return ret
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(' ','')
ret = remove_bracket(s) #调用去括号函数,并拿到最终计算的结果
print('result : ',ret) #将最终计算结果打印
更多专业前端知识,请上 【猿2048】www.mk2048.com
转载:https://blog.csdn.net/setsunadoudou/article/details/102228282
查看评论