一句話需求:從ETL的log中提取出來一個ETL腳本落地了哪些臨時表,日常數據庫運維需要這些數據。
經過python程序處理後,提取到了如下的信息,這些在腳本中DELETE的都是臨時表。
DELETE FROM DTEMP.L_SELL_PROXY_MARKETER_02 ALL;
可能大家疑惑這個很簡單啊,不用正則,python完全可以處理。暫且不去討論”前人”爲何選擇正則去處理。
先上”前人”的正則表達式:
.+\.(.+)\sALL;
分析該正則:
.+ .匹配換行以外的任意字符,而後面的+代表匹配優先量詞,因此.+匹配了正行數據
\. 匹配一個.符號,由於要匹配這個字符,前面.+不得不將他匹配到的吐出來,直到.的位置,這就產生了幾十個回溯
(.+) 同理依舊會吐下.以後所有的字符
\sALL; 又強迫(.+)吐出來很多字符,這又產生了回溯
這個正則總共回溯近40次 完成了匹配,雖然對我們的程序沒有產生太大的效率問題,還是決定優化下這個正則。
該正則問題在於濫用. 和+
優化思考:
1:既然我只要表名(L_SELL_PROXY_MARKETER_02)那麼我是否能將匹配的錨點定到.
這個位置
2:分組中的.何不換成\w
最後的正則:
(?=\.)\.(\w+).?
優化後的執行:
測試通過:
import re
print re.search(r"(?=\.)\.(\w+).?","DELETE FROM DTEMP.L_SELL_PROXY_MARKETER_02 ALL;").group(1)