python正則表示式大作業之模擬計算器(29行程式碼)
阿新 • • 發佈:2018-12-10
- 今天很開心,完成了一項艱鉅的作業,剛開始見到這個作業時我是有些懵逼的,一心想著用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