使用re開發python計算器
#!/usr/bin/env python
import re
import functools
def minus_operator_handler(formula):
‘‘‘處理一些特殊的減號運算‘‘‘
minus_operators = re.split("-",formula)
calc_list = re.findall("[0-9]",formula)
if minus_operators[0] == ‘‘: # 第一個值肯定是負號
calc_list[0] = ‘-%s‘ % calc_list[0]
result = functools.reduce(lambda x,y: float(x) - float(y),calc_list)
print(" - [%s] of result is : " % formula, result )
return result
def handle_minus_in_list(operator_list,calc_list):
‘‘‘
有的時候把算術符和值分開後,會出現這種情況 [‘-‘, ‘-‘, ‘-‘] [‘ ‘, ‘14969037.996825399 ‘, ‘ ‘, ‘12.0/ 10.0 ‘]
這需要把第2個列表中的空格都變成負號並與其後面的值拼起來
‘‘‘
for index,item in enumerate(calc_list):
if item == ‘‘:
calc_list[index+1] = item + calc_list[index+1].strip()
def compute_mutiply_and_dividend(formula):
‘‘‘計算乘除的內容,這裏傳進來的是字符串‘‘‘
# 找出所有帶*、/符號的內容
operators = re.findall("[*/]",formula)
# 以*、/為分隔符,取出所有排除掉*、/的內容
calc_list = re.split("[*/]",formula)
# 結果初始化未None
result = None
# 遍歷顯示數組中的索引號(index)、內容(i)
for index,i in enumerate(calc_list):
if result: # 代表不是第一次循環
if operators[index-1] == "*":
result *= float(i)
elif operators[index-1] == "/":
result /= float(i)
else:
result = float(i)
print("[%s] of result is : " %formula, result)
return result
def handle_special_occactions(plus_and_minus_operators,multiply_and_dividend):
‘‘‘有時會出現這種情況 , [‘-‘, ‘-‘] [‘1 ‘, ‘ 2 * ‘, ‘14969036.7968254‘],2*...後面這段實際是 2*-14969036.7968254,需要特別處理下‘‘‘
# 遍歷顯示數組multiply_and_dividend中的索引號(index)、內容(i)
for index,i in enumerate(multiply_and_dividend):
# 清除空格、空白
i = i.strip()
# 如果 內容的結尾是*、/
if i.endswith("*") or i.endswith("/"):
multiply_and_dividend[index] = multiply_and_dividend[index] + plus_and_minus_operators[index] + multiply_and_dividend[index+1]
del multiply_and_dividend[index+1]
del plus_and_minus_operators[index]
return plus_and_minus_operators,multiply_and_dividend
def remove_addsubtract(formula):
‘‘‘將加減組合的符號替換成合並後的符號‘‘‘
formula = formula.replace("++","+")
formula = formula.replace("--","+")
formula = formula.replace("+-","-")
formula = formula.replace("-+","-")
formula = formula.replace("- -","+")
return formula
def compute(formula):
‘‘‘這裏計算不帶括號的內容‘‘‘
# 去掉外層的括號
formula = formula.strip("()") # strip是去除的函數
# 將加減組合的符號替換成合並後的符號
formula = remove_addsubtract(formula)
# 找出替換後剩余的所有帶+、-符號的內容
plus_and_minus_operators = re.findall("[+-]",formula)
# 以+、-為分隔符,取出所有排除掉+、-的內容,即取出所有*/的內容
multiply_and_dividend = re.split("[+-]",formula)
if len(multiply_and_dividend[0].strip()) == 0: # 代表這肯定是個減號
multiply_and_dividend[1] = plus_and_minus_operators[0] + multiply_and_dividend[1]
del multiply_and_dividend[0]
del plus_and_minus_operators[0]
plus_and_minus_operators,multiply_and_dividend = handle_special_occactions(plus_and_minus_operators,multiply_and_dividend)
# 遍歷顯示數組multiply_and_dividend中的索引號(index)、內容(i)
for index,i in enumerate(multiply_and_dividend):
if re.search("[*/]",i):
calc_inside_result = compute_mutiply_and_dividend(i)
multiply_and_dividend[index] = calc_inside_result
‘‘‘開始運算+、-‘‘‘
print(multiply_and_dividend,plus_and_minus_operators)
total_result = None # 初始化total_result
# 遍歷顯示數組multiply_and_dividend中的索引號(index)、內容(item)
for index,item in enumerate(multiply_and_dividend):
if total_result: # 代表不是第一次循環
if plus_and_minus_operators[index-1] == "+":
total_result += float(item)
elif plus_and_minus_operators[index-1] == "-":
total_result -= float(item)
else:
total_result = float(item)
print("[%s] of result is : " %formula,total_result)
return total_result
def calc(formula):
‘‘‘計算程序主入口, 主要邏輯是先計算括號裏的值,算出來後再算乘除,再算加減‘‘‘
#給括號的狀態設置初始值,假定括號存在
parenthesis_flag = True
#初始化運算結果為None,還沒開始運算
calc_result = None
while parenthesis_flag:
#找到最裏面一層的括號。正則表達式:()中間沒有()的所有字符
inside = re.search("\([^()]*\)",formula)
if inside:
# 先計算括號裏面的值
calc_inside_result = compute(inside.group())
formula = formula.replace(inside.group(),str(calc_inside_result))
else:
print(‘\033[41;1m~~~沒括號了~~~\033[0m‘)
print(‘The End Result is : ‘,compute(formula))
# 公式中的括號都被剔除了
parenthesis_flag = False
#程序的入口
if __name__ == ‘__main__‘:
result = calc("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) )")
使用re開發python計算器