使用到了模塊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的一篇評論,主要是計算部分與正則部分!!!
