一篇值得收藏的正則表達(dá)式文章
點擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時間送達(dá)

使用正則表達(dá)式去匹配字符串Hello World 中的 Hello
偽代碼:/Hello/, "Hello World"
輸出:Hello
如何寫好一篇關(guān)于 正則表達(dá)式 的文章,我思考了一周的時間,從未有一篇文章能讓豬哥如此費神。
因為我覺得正則表達(dá)式 :難記憶、難描述、廣而深且不受重視,有人說正則表達(dá)式既好寫也難寫!
好寫:無非寫一些常用、實用的案例,說實話你們每個人都能寫出這種:在網(wǎng)上百度一下然后結(jié)合一點自己的實際經(jīng)驗,一篇文章就出來了。 難寫:很多人都認(rèn)為正則簡單,不用記,要用就百度一下。但是絕大多數(shù)人了解的只是正則的一個小面,真正的精髓卻很少關(guān)注!


* ^ $ \d 等等

1.執(zhí)行過程

re模塊舉例:通過 re.compile(pattern)預(yù)編譯返回Pattern對象,在后面代碼中可以直接引用。通過 re.match(pattern, text)即用編譯,雖然也會有緩存Pattern對象,但是每次使用都需要去緩存中取出,比預(yù)編譯多一步取操作。
pattern = r'http:\/\/(?:.?\w+)+'text = 'xxx.com'

2.引擎(重點)
DFA (Deterministic finite automaton) 確定型有窮自動機 NFA (Non-deterministic finite automaton) 非確定型有窮自動機
確定型、有窮、自動機這幾個名詞:確定型與非確定型:假設(shè)有一個字符串(text=abc)需要匹配,在沒有編寫正則表達(dá)式的前提下,就直接可以確定字符匹配順序的就是確定型,不能確定字符匹配順序的則為非確定型。 有窮:有窮即表示有限的意思,這里表示有限次數(shù)內(nèi)能得到結(jié)果。 自動機:自動機便是自動完成,在我們設(shè)置好匹配規(guī)則后由引擎自動完成,不需要人為干預(yù)!
為了大家能很清楚的理解DFA引擎執(zhí)行原理,豬哥制作了一個簡易的動態(tài)執(zhí)行過程圖給大家看看

根據(jù)上面的動圖我們可以得出DFA引擎的一些特點:
文本主導(dǎo):按照文本的順序執(zhí)行,這也就能說明為什么DFA引擎是確定型(deterministic)了,穩(wěn)定! 記錄當(dāng)前有效的所有可能:我們看到當(dāng)執(zhí)行到 (d|b)時,同時比較表達(dá)式中的d和b,所以會需要更多的內(nèi)存。每個字符只檢查一次:這提高了執(zhí)行效率,而且速度與正則表達(dá)式無關(guān)。 不能使用反向引用等功能:因為每個字符只檢查一次,文本零寬度(位置)只記錄當(dāng)前比較值,所以不能使用反向引用、環(huán)視等一些功能!
豬哥同樣畫了一個簡易的NFA引擎執(zhí)行過程圖方便大家理解

根據(jù)上面的動圖我們可以得出NFA引擎的一些特點:
文表達(dá)式主導(dǎo):按照表達(dá)式的一部分執(zhí)行,如果不匹配換其他部分繼續(xù)匹配,直到表達(dá)式匹配完成。 會記錄某個位置:我們看到當(dāng)執(zhí)行到 (d|b)時,NFA引擎會記錄字符的位置(零寬度),然后選擇其中一個先匹配。單個字符可能檢查多次:我們看到當(dāng)執(zhí)行到 (d|b)時,比較d后發(fā)現(xiàn)不匹配,于是NFA引擎換表達(dá)式的另一個分支b,同時文本位置回退,重新匹配字符'b'。這也是NFA引擎是非確定型的原因,同時帶來另一個問題效率可能沒有DFA引擎高。可實現(xiàn)反向引用等功能:因為具有回退這一步,所以可以很容易的實現(xiàn)反向引用、環(huán)視等一些功能!

DFA(電動機) 和NFA(汽油機) 都有很長的歷史,不過,正如汽油機一樣,NFA 的歷史更長一些。也有些系統(tǒng)采用了混合引擎,它們會根據(jù)任務(wù)的不同選擇合適的引擎(甚至對同一表達(dá)式中的不同部分采用不同的引擎,以求得功能與速度之間的最佳平衡)。? ? ? ?——《精通正則表達(dá)式》
3.回溯(重點)

動圖中,我們可以看到當(dāng)某個正則分支匹配不成功之后,文本的位置需要回退,然后換另一個分支匹配,而回退這步專業(yè)術(shù)語就叫:回溯。

$1=b。(a*):匹配到了文本中的aaaaa 匹配正則中的b,但是失敗,因為(a*)已經(jīng)把text都吃了 這時候引擎會要求(a*)吐出最后一個字符(a),但是無法匹配b 第二次是吐出倒數(shù)第二個字符(還是a),依然無法匹配 就這樣引擎會要求(a*)逐個將吃進去的字符都吐出來 但是到最后都無法匹配b
*匹配的東西一點一點吐回,我們假設(shè)如果文本長度為幾萬,那引擎就要回溯幾萬次,這對機器的CPU來說簡直是災(zāi)難。
在面試過程中也許會被問到關(guān)于正則的優(yōu)化,大家記住幾點就可以。
1.書

2.博客
深入:某不知名大佬:https://blog.csdn.net/lxcnn
3.在線測試工具

4.常用案例

最后祝愿大家都能搞定正則表達(dá)式,處理文本可以得心應(yīng)手!
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~
評論
圖片
表情
