使用到了模塊re,正則,字典等
# 實現簡單的加減乘除括號等運算 # Calculator def calculator(expression): print(expression) import re # 操作字典,目前只支持加減乘除 operatorDict ={ '+': lambda a, b: float(a)+float(b), '-': lambda a, b: float(a)+float(b), '*': lambda a, b: float(a)+float(b), '/': lambda a, b: float(a)+float(b), } # 計算去括號后表達式的值 def calBrackets(expre): for i in operatorDict: expre = expre.replace(i, 's'+i+'s') l = expre.split('s') # 表達式轉化為數字運算符列表 # 將-和數字組合在一起 l2, i = [], 0 while i < len(l): # 處理負數 if l[i] == '': # 負號開頭或者負號與其他運算符連在一起,splite后會為'',例如 -5*-2 ['','-','5','*','','-','2'] l2.append(l[i+1]+l[i+2]) # 將符號和數字合一起 -2 i += 2 else: l2.append(l[i]) i += 1 # l2為新數字運算符列表(處理符號后,例['-1', '+', '*', '-3']) # 運算乘除 i = 1 while i < len(l2): # 計算乘除 if l2[i] in ['*', '/']: # 將符號左右以及符號三個元素替換為運算結果,必須是個列表, list[m:n] :切片取值連續,不包括n l2[i-1:i+2] = [operatorDict[l2[i]](l2[i-1], l2[i+1])] # 運算 else: i += 2 # 運算加減,直接按順序計算替換 while len(l2) > 1: l2[0:3] = [operatorDict[l2[1]](l2[0], l2[2])] return str(l2[0]) # 去除空格 expression = expression.replace(' ', '') # 正則匹配表達式是否包含括號 [^\(\)] : 匹配不是( 或者) 的內容,即非括號內容 check = re.search('\([^\(\)]+\)', expression) # 返回匹配到的內容,帶括號,只返回一個 # 去掉括號 while check: checkValue = check.group() # 將匹配到的括號表達式替換成值,括號去掉使用函數求值 expression = expression.replace(checkValue, calBrackets(checkValue[1:-1])) check = re.search('\([^\(\)]*\)', expression) else: return calBrackets(expression) # 測試 result = calculator('1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )') print(result)
主要邏輯部分做了注釋,參考了d_k的一篇評論,主要是計算部分與正則部分!!!