1. 程式人生 > >基於正則和叠代模式的計算器源碼

基於正則和叠代模式的計算器源碼

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))

基於正則和叠代模式的計算器源碼