做業要求:python
經過python re模塊計算表達式:正則表達式
1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
禁止使用 eval 或者 直接運算,結合正則表達式進行處理算法
README部分ide
使用正則表達式計算帶括號的四則運算 1. 去除表達式中的括號 2. 經過正則表達式獲取最內層的第一個括號 3. 去掉括號進行先乘除再加的算法 4. 用計算結果替換掉括號裏的內容 5. 判斷是否還存在括號,存在重複執行一、二、三、4 6. 不存在括號執行先乘除、再加的算法計算出最終結果
流程圖:函數
代碼實現部分:spa
#!/usr/bin/python3 # -*- coding: utf-8 -*- # Author: hkey import re s = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )' def wipe(s): ''' 根據數學運算,去除重複的運算符號 :param s: 只剩下加減運算的表達式 :return: 去除多餘的表達式符號 ''' res = s.replace('+-', '-').replace('-+', '-').replace('++', '+').replace('--', '+') # 經過replace進行替換 return res def get(s): ''' 去除原始表達式中的空格,並經過re.split以最內層括號第一個分隔爲三個元素,最內層括號第一個表達式的索引爲 1 :param s: 最原始的運算表達式 :return: 返回list,其中其中索引爲1的元素就是最內層括號第一個首先要計算的表達式 ''' no_space_exp = re.sub(' ', '', s) # re.sub 去除表達式中的空格符 res = re.split("(\([^()]+\))", no_space_exp, 1) # 分解成列表且索引爲1的元素即第一個要計算的表達式 return res def add_num(s): ''' 加減運算 :param s: 去括號後的計算表達式 :return: 加減表達式計算後的結果值 ''' s = wipe(s) # 進行加減運算的時候,去除掉多餘的符號 list_num = re.findall("([+-]?\d+\.?\d*)", s) # 查找表達式中的每一個具體的數字 k = 0 for i in list_num: k += float(i) # 進行累加操做 return k def mul(s): ''' 乘除算法,若是表示不存在乘除運算就返回到加減函數中 :param s: 括號中要計算的表達式 :return: 加減函數 ''' while True: res = re.split("(\d+\.?\d*[*/][+-]?\d+\.?\d*)", s, 1) # 獲取括號內的計算表達式 if len(res) == 3 and '*' in res[1]: # 判斷計算表達式是不是乘法計算 a, b, c = res d, e = b.split('*') res_b = float(d) * float(e) # 進行乘法計算 s = a + str(res_b) + c # 括號內計算的結果替換掉帶括號的表達式 elif len(res) == 3 and '/' in res[1]: # 判斷計算表達式是不是除法計算 a, b, c = res d, e = b.split('/') res_b = float(d) / float(e) # 進行除法計算 s = a + str(res_b) + c # 括號內計算的結果替換掉帶括號的表達式 else: return add_num(s) # 若是表達式不存在乘法和除法,則進行加減運算 def counter(s): ''' 循環計算括號中的表達式,並將計算結果替換原始表達式括號的內容 :param s: 傳入要計算的原始表達式 :return: 當全部的括號計算完成並替換完畢後,在進行最後的計算並獲得最終結果 ''' while True: res = get(s) if len(res) == 3: a, b, c = res res_b = mul(b) s = a + str(res_b) + c else: return mul(s) print(counter(s))