1. 程式人生 > >python正則表示式大作業之模擬計算器(29行程式碼)

python正則表示式大作業之模擬計算器(29行程式碼)

  • 今天很開心,完成了一項艱鉅的作業,剛開始見到這個作業時我是有些懵逼的,一心想著用findall精準匹配,但是發現匹配後無法處理資料,後來看了點兒老師的思路——用search一個一個地匹配然後替換,然後我就按著這個思路冥思苦想了一下午,終於讓我搞出來了,哦耶,我的精通正則表示式沒白看。現在有些累了,改天再逐行解說程式碼含義。
import re
str1 = '1 - 2 * ( ( 6 0 -3 0  +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
str1 = re.sub('\s*','',str1)
def
cal_digit(x):
temp = re.split(r'(?<=\d)[-+*/](?=\d|[-+*/]\d)',x.group()) a = float(temp[0]) b = 0 if len(temp) > 1 : b = float(temp[1]) if re.search(r'(?<=\d)\+(?=\d|[-+*/]\d)',x.group()): return str(a+b) if re.search(r'(?<=\d)\-(?=\d|[-+*/]\d)',x.group()): return str(a-b) if
re.search(r'(?<=\d)\*(?=\d|[-+*/]\d)',x.group()): return str(a*b) if re.search(r'(?<=\d)\/(?=\d|[-+*/]\d)',x.group()): return str(a/b) def cal_backets(x): x = x.strip('()') while 1: digit = re.search(r'((^-)|(?<=[-+*/])-)?\d*(\.\d*)?[*/]((?<=[-+*/])-)?\d*(\.\d*)?',x) if
not digit: break x = re.sub(r'((^-)|(?<=[-+*/])-)?\d*(\.\d*)?[*/]((?<=[-+*/])-)?\d*(\.\d*)?',cal_digit(digit),x,1) while 1: digit = re.search(r'((^-)|(?<=[-+*/])-)?\d+(\.\d*)?[-+]((?<=[-+*/])-)?\d+(\.\d*)?',x) if not digit: break x = re.sub(r'((^-)|(?<=[-+*/])-)?\d+(\.\d*)?[-+]((?<=[-+*/])-)?\d+(\.\d*)?',cal_digit(digit),x,1) return x while 1: digit_brackets = re.search(r'\([^()]*\)',str1) if not digit_brackets : break str1 = re.sub(r'\([^()]*\)',cal_backets(digit_brackets.group()),str1,1) res = cal_backets(str1) print(res)
2776672.6952380957