基於正則和叠代模式的計算器源碼
阿新 • • 發佈:2017-08-14
pre 默認參數 utf-8 nco 退出 spl pan ner imp
源碼如下:
1 # encoding:utf-8 2 # Author:"richie" 3 # Date:2017/8/8 4 import re 5 # 待處理數據 6 s = ‘1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))‘ 7 pat_bracket = re.compile(r"""\([^(]*?\)""", re.X) # 過濾括號內的算數表達式 8 pat_divmod = re.compile(r"""\d+\.?\d*[*/]-?\d+\.?\d*""", re.X) # 過濾乘除算數表達式9 pat_add = re.compile(r"""-?\d+\.?\d*[+-]-?\d+\.?\d*""", re.X) # 過濾加減算術表達式 10 11 12 def my_sum(str_inner_new,ret = 0): 13 """ 14 基本算數運算函數 15 :param str_inner_new: 一個數學表達式字符串 16 :param ret: 返回的默認參數 17 :return: 返回運算結果 以字符串形式 18 """ 19 # 如果傳入的表達式中含有‘--‘則用‘+‘替換 20 str_inner_new = str_inner_new.replace(‘--‘, ‘+‘) if ‘--‘ in str_inner_new else str_inner_new 21 22 if ‘*‘ in str_inner_new: # 表達式為乘法運算 23 number_l = str_inner_new.split(‘*‘) 24 ret = float(number_l[0]) * float(number_l[1]) 25 elif ‘/‘ in str_inner_new:# 表達式為除法運算 26 number_l = str_inner_new.split(‘/‘) 27 ret = float(number_l[0]) / float(number_l[1])28 elif re.search(‘[-+]‘, str_inner_new) is not None: # 表達式為加法和減法運算 29 number_l = str_inner_new.split(‘+‘) if ‘+‘ in str_inner_new else str_inner_new.replace(‘-‘, ‘ -‘).split() 30 ret = sum([float(i) for i in number_l]) 31 return str(ret) 32 33 def my_eval(pat, data): 34 """ 35 算數運算函數 36 :param pat: 過濾算數運算表達式 37 :param data: 需要運算的表達式 38 :return: 運算結果 39 """ 40 # 當過濾的data中沒有括號,沒有加減乘除運算表達式,表示已經運算完成,退出函數 41 if pat_bracket.search(data) is None and pat_divmod.search(data) is None and pat_add.search(data) is None : 42 return data.replace(‘--‘, ‘‘) 43 if pat.search(data) is not None and pat == pat_bracket: # 如果找到括號內容 44 str_inner = re.sub(r‘[\(\)]‘, ‘‘, pat.search(data).group(0)) # 去除表達式括號 45 # 運算括號內的表達式,求出結果,然後用運算結果替換括號表達式內容 46 return my_eval(pat, data.replace(pat.search(data).group(0), my_eval(pat_divmod, str_inner))) 47 elif pat == pat_bracket: # 如果data中找不到括號內容,則運算乘除法或加減法 48 return my_eval(pat_divmod, data) if pat_divmod.search(data) is not None else my_eval(pat_add, data) 49 elif pat.search(data) is None: # 如果沒有括號,沒有乘除法,則運算加減法 50 return my_eval(pat_add, data) 51 ret = my_sum(pat.search(data).group(0)) # 運算基本表達式結果 52 return my_eval(pat, data.replace(pat.search(data).group(0), ret)) 53 # 輸出表達式運算結果 54 print(eval(s), my_eval(pat_bracket, s))
基於正則和叠代模式的計算器源碼