參考一書對我們ETL log解析模塊一個正則的優化

一句話需求:從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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章