importre,traceback
# s = '1 -+++++++++ 2 * ( (60-30 ++(----9-2- 5-2*-3++-5/3-40*+4//++++2-3/5+6****3) * (++++++-9-2-5-2*5/3 + 7 /3*99/4)))'s = '----1+2+3+4+5+20*100-10*10'defformat(s):
blank_remove = re.sub(' +','',s) #去除空格add_min_corr = re.sub('\++-','-',blank_remove) #减号前的加号去除min_add_corr = re.sub('-\++','-',add_min_corr) #减号后的加号去除min_corr = re.sub('--','+',min_add_corr) #2个减号修正为1个加号add_corr = re.sub('\++','+',min_corr) #多个加号修正为1个mul_corr = re.sub('\*+','*',add_corr) #多个乘号修正为1个div_corr = re.sub('/+','/',mul_corr) #多个除号修正为1个mul_add_corr = re.sub('\/+\++','/',div_corr) #多个除号和加号,修正为1个除号div_add_corr = re.sub('\*+\++','*',mul_add_corr)#多个乘号和加号,修正为1个乘号returndiv_add_corr
#判断是否有运算符和数字外的其他字符defcheck(s):
check_result = Truespecial_symbol = re.findall('[^0-9+\-*/() ]',s)#是否有特殊符号branket_left = s.count('(')
branket_right = s.count(')')
ifspecial_symbol:
print('有特殊字符,无法计算!')
check_result = Falseifbranket_left != branket_right:
print('左右括号未匹配')
check_result = Falsereturncheck_result
#乘除法defcal_mul_div(s):
num= 0ret = re.search('\d+\.?\d*[*/][-+]?\d+\.?\d*',s)
whileret:
ret1 = ret.group()
print(ret1)
x,y = re.split('[*/]',ret1)
if'*'inret1:
num = float(x)*float(y)
else:
num = float(x)/float(y)
s=s.replace(ret1,str(num))
ret = re.search('\d+\.?\d*[*/][-+]?\d+\.?\d*',s)
print(s)
else:
print('乘法结束')
returnformat(s)
#加减法defcal_add_min(s):
num = 0ret = re.search('-?\d+\.?\d*[+-]\d+\.?\d*',s)
whileret:
ret1 = ret.group()
print(ret1)
iflen(re.split('[+-]',ret1)) == 3:
sym,x,y = re.split('[+-]',ret1)
if'+'inret1:
num = float(y)-float(x)
elif'+'not inret1:
num = -(float(x)+float(y))
else:
x,y = re.split('[+-]',ret1)
if'+'inret1:
num = float(y)+float(x)
elif'+'not inret1:
num = float(x)-float(y)
s=s.replace(ret1,str(num))
ret = re.search('-?\d+\.?\d*[+-]\d+\.?\d*',s)
print(s)
else:
print('加法结束')
returnformat(s)
s =format(s) #对运算符格式化check(s) #核查是否有运算数字,运算符之外的defcal_num(s):
if'('ins:
num = 0ret =re.search('\([^()]+\)',s)
exist_sym = re.search('-?\d+\.?\d*[+\-*/]',ret.group())
whileret andexist_sym:
ret1 = ret.group()
print(ret1)
ret2 = cal_mul_div(ret1)
print(ret2)
ret2 = cal_add_min(ret2)
ret2 = re.sub('[()]','',ret2)
print(s)
s = s.replace(ret1,ret2)
num += 1print('第%s次结果'%num,s)
ret = re.search('\([^()]+\)',s)
print('匹配括号',ret.group())
exist_sym = re.search('-?\d+\.?\d*[+\-*/]',ret.group())
print(exist_sym)
while notexist_sym andret:
ret2 = re.sub('[()]','',ret.group())
print(ret2)
s = s.replace(ret.group(),ret2)
print(s)
ret = re.search('\([^()]+\)',s)
else:
ret_s = cal_mul_div(s)
ret_s = cal_add_min(ret_s)
print('运算结果:',ret_s)
else:
ret_s = cal_mul_div(s)
ret_s = cal_add_min(ret_s)
print('运算结果:',ret_s)
cal_num(s)
运算结果:
"D:\Program Files\Python37\python.exe" "D:/Program Files/Python37/Aron/test.py"
(+9-2-5-2*-3-5/3-40*4/2-3/5+6*3)
2*-3
(+9-2-5--6.0-5/3-40*4/2-3/5+6*3)
5/3
(+9-2-5--6.0-1.6666666666666667-40*4/2-3/5+6*3)
40*4
(+9-2-5--6.0-1.6666666666666667-160.0/2-3/5+6*3)
160.0/2
(+9-2-5--6.0-1.6666666666666667-80.0-3/5+6*3)
3/5
(+9-2-5--6.0-1.6666666666666667-80.0-0.6+6*3)
6*3
(+9-2-5--6.0-1.6666666666666667-80.0-0.6+18.0)
乘法结束
(+9-2-5+6.0-1.6666666666666667-80.0-0.6+18.0)
9-2
(+7.0-5+6.0-1.6666666666666667-80.0-0.6+18.0)
7.0-5
(+2.0+6.0-1.6666666666666667-80.0-0.6+18.0)
2.0+6.0
(+8.0-1.6666666666666667-80.0-0.6+18.0)
8.0-1.6666666666666667
(+6.333333333333333-80.0-0.6+18.0)
6.333333333333333-80.0
(+-73.66666666666667-0.6+18.0)
-73.66666666666667-0.6
(+-74.26666666666667+18.0)
-74.26666666666667+18.0
(+-56.266666666666666)
加法结束
1-2*((60-30+(+9-2-5-2*-3-5/3-40*4/2-3/5+6*3)*(-9-2-5-2*5/3+7/3*99/4)))
第1次结果 1-2*((60-30+-56.266666666666666*(-9-2-5-2*5/3+7/3*99/4)))
匹配括号 (-9-2-5-2*5/3+7/3*99/4)
2*5
1-2*((60-30+-56.266666666666666*(-9-2-5-10.0/3+7/3*99/4)))
10.0/3
1-2*((60-30+-56.266666666666666*(-9-2-5-3.3333333333333335+7/3*99/4)))
7/3
1-2*((60-30+-56.266666666666666*(-9-2-5-3.3333333333333335+2.3333333333333335*99/4)))
2.3333333333333335*99
1-2*((60-30+-56.266666666666666*(-9-2-5-3.3333333333333335+231.00000000000003/4)))
231.00000000000003/4
1-2*((60-30+-56.266666666666666*(-9-2-5-3.3333333333333335+57.75000000000001)))
乘法结束
1-2
-1.0*((60-30-56.266666666666666*(-9-2-5-3.3333333333333335+57.75000000000001)))
60-30
-1.0*((30.0-56.266666666666666*(-9-2-5-3.3333333333333335+57.75000000000001)))
30.0-56.266666666666666
-1.0*((-26.266666666666666*(-9-2-5-3.3333333333333335+57.75000000000001)))
-9-2
-1.0*((-26.266666666666666*(-11.0-5-3.3333333333333335+57.75000000000001)))
-11.0-5
-1.0*((-26.266666666666666*(-16.0-3.3333333333333335+57.75000000000001)))
-16.0-3.3333333333333335
-1.0*((-26.266666666666666*(-19.333333333333332+57.75000000000001)))
-19.333333333333332+57.75000000000001
-1.0*((-26.266666666666666*(38.41666666666667)))
加法结束
(-9-2-5-2*5/3+7/3*99/4)
2*5
(-9-2-5-10.0/3+7/3*99/4)
10.0/3
(-9-2-5-3.3333333333333335+7/3*99/4)
7/3
(-9-2-5-3.3333333333333335+2.3333333333333335*99/4)
2.3333333333333335*99
(-9-2-5-3.3333333333333335+231.00000000000003/4)
231.00000000000003/4
(-9-2-5-3.3333333333333335+57.75000000000001)
乘法结束
(-9-2-5-3.3333333333333335+57.75000000000001)
-9-2
(-11.0-5-3.3333333333333335+57.75000000000001)
-11.0-5
(-16.0-3.3333333333333335+57.75000000000001)
-16.0-3.3333333333333335
(-19.333333333333332+57.75000000000001)
-19.333333333333332+57.75000000000001
(38.41666666666667)
加法结束
1-2*((60-30+-56.266666666666666*(-9-2-5-2*5/3+7/3*99/4)))
第2次结果 1-2*((60-30+-56.266666666666666*38.41666666666667))
匹配括号 (60-30+-56.266666666666666*38.41666666666667)
56.266666666666666*38.41666666666667
1-2*((60-30+-2161.577777777778))
乘法结束
1-2
-1.0*((60-30-2161.577777777778))
60-30
-1.0*((30.0-2161.577777777778))
30.0-2161.577777777778
-1.0*((-2131.577777777778))
加法结束
(60-30+-56.266666666666666*38.41666666666667)
56.266666666666666*38.41666666666667
(60-30+-2161.577777777778)
乘法结束
(60-30-2161.577777777778)
60-30
(30.0-2161.577777777778)
30.0-2161.577777777778
(-2131.577777777778)
加法结束
1-2*((60-30+-56.266666666666666*38.41666666666667))
第3次结果 1-2*(-2131.577777777778)
匹配括号 (-2131.577777777778)
None
-2131.577777777778
1-2*-2131.577777777778
2*-2131.577777777778
1--4263.155555555556
乘法结束
1+4263.155555555556
4264.155555555556
加法结束
运算结果: 4264.155555555556
Process finished with exit code 0