本文實例為大家分享了python正則實現計算器功能的具體代碼,供大家參考,具體內容如下
# -*- coding: utf-8 -*- # Author  :Gogh # @Time   :2017/12/4 20:16 # @Email  :361910002@qq.com import re def operator_update(formula):   # 對formula公式進行 去除空字符,更新運算符處理   formula = formula.replace(" ", "") # 去除空字符   formula = formula.replace("+-", "-")   formula = formula.replace("--", "+")   return formula   def calc_muldiv(formula_list):   '''''   計算公式里面的乘除   :param formula: 列表   :return:   '''   for index, element in enumerate(formula_list):     if "*" in element or "/" in element:       operators = re.findall("[*/]", element)       calc_list = re.split("[*/]", element)       num = None       for i, e in enumerate(calc_list):         if num:           if operators[i - 1] == "*":             num *= float(e)           elif operators[i - 1] == "/":             num /= float(e)         else:           num = float(e)       formula_list[index] = num   return formula_list   def calc_plumin(operators, num_list):   '''''   計算列表數字的加減   :param operators: 運算符列表   :param num_list: 進行運算的數字列表   :return: 返回計算結果   '''   num = None   for i, e in enumerate(num_list):     if num:       if operators[i - 1] == "+":         num += float(e)       elif operators[i - 1] == "-":         num -= float(e)     else:       num = float(e)   return num   def merge(plus_minus_operator, multiply_divide_list):   '''''   把列表中這樣的形式'2*' '-3*' '5/3*' '4/2'合并到一塊   :param formula_list:   :return:   '''   for index, element in enumerate(multiply_divide_list):     if element.endswith("*") or element.endswith("/"):       multiply_divide_list[index] = element + plus_minus_operator[index] + multiply_divide_list[index + 1]       del multiply_divide_list[index + 1]       del plus_minus_operator[index]       return merge(plus_minus_operator, multiply_divide_list)   return plus_minus_operator, multiply_divide_list   def bracket_calc(formula):   '''''   對括號最內層的formula公式進行計算   :param formula:   :return:   '''   formula = re.sub("[()]", "", formula) # 去除兩邊的()   formula = operator_update(formula)   plus_minus_operator = re.findall("[+-]", formula) # 列表 '+' '-' 運算符   multiply_divide_list = re.split("[+-]", formula) # 列表 有'*' '/'   if multiply_divide_list[0] == "": # multiply_divide_list列表第一個字符為空的話,表示一個數字為負號     multiply_divide_list[1] = "-" + multiply_divide_list[1]     del plus_minus_operator[0]     del multiply_divide_list[0]   res = merge(plus_minus_operator, multiply_divide_list)   plus_minus_operator = res[0] # 列表 '+' '-' 運算符 進行合并處理   multiply_divide_list = res[1]   plus_minus_list = calc_muldiv(multiply_divide_list) # 生成只進行加減運算的列表   res = calc_plumin(plus_minus_operator, plus_minus_list)   return res   def calculate(formula):   '''''計算程序主入口, 主要邏輯是先計算拓號里的值,算出來后再算乘除,再算加減'''   while True:     formula_depth = re.search("[()]+", formula)     if formula_depth:       formula_depth = formula_depth.group()       res = bracket_calc(formula_depth)       formula = formula.replace(formula_depth, str(res))       print("/33[34;1m%s/33[0m" % (formula))     else:       res = bracket_calc(formula)       print("/33[31;1m結果:%s/33[0m" % (res))       exit()   if __name__ == '__main__':   formula = "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*2998 +10 * 568/14 )) -(-4*3)/ (16-3*2) )"   calculate(formula)            
新聞熱點
疑難解答