インポート再 から functoolsはインポート減らす DEF(EXP)をmul_div: #2つの数の乗算又は除算の IF ' * ' でEXP: A、B = exp.split(' * ' ) を返すフロート(A)を* フロート(B) IF ' / ' でEXP: A、B = exp.split(' / ' ) を返すフロートを(A)/ フロート(B) DEF (EXP)をexp_fmt: 一方 re.search('[+ - ] {2} 'EXP): EXP = exp.replace(' - ' ' + ' ) EXP = exp.replace(' + - ' ' - ' ) EXP = exp.replace(' - + ' ' - ' ) EXP = exp.replace(' ++ ' ' + " ) を返すEXP デフremove_addsub(EXP): RET =再。findAll( ' - (?:\ \ D +)?[+] \ D + ' 、EXP) RES =減らす(ラムダ A、B:フロート(A)+ フロート(B)、RET) を返すRES DEFの remove_muldiv(EXP)を: #すべての乗算と除算式計算し ながら、真: RETを = re.searchを('。??? \ D +(\ \ D +)[* /] - \ D +(\ \ D +)' 、EXP) IF RET : son_exp = ret.group() #3 4 * 5 * 12である。 RES = mul_div(son_exp) EXP = exp.replace(son_exp、STR(RES)) 他:リターンEXP DEF CAL(EXP): RES = remove_muldiv(EXP) #の計算である RES = exp_fmt(RES) #の仕上げ記号 RET = remove_addsub(RES) #減算演算 リターンRET DEF 主に(EXP): EXP = exp.replaceを(' ' ' ' ) しばらく真: RET = re.search(' \([^()] + \)" 、EXP) IF RET: RES = CAL(ret.group()) EXP =exp.replace(ret.group()、STR(RES)) 他:リターンCAL(EXP) EXP = " 1から2 *((60-30 +( - 40/5)*(9-2 * 5月3日+ 7/3 * 4分の99 * 2998 +10 * 14分の568)) - (-4 * 3)/(16-3 * 2))' RET = メイン(EXP) プリント(RET)