簡體   English   中英

Python re模塊組匹配機制

[英]Python re module groups match mechanism

問題形成

背景

在我閱讀python2.7 redoc的教程時,它介紹了組的行為:

groups()方法返回一個元組,其中包含所有子組的字符串,從1到有很多子組。

我很清楚這是如何工作的。 但我可以理解以下示例:

>>> m = re.match("([abc])+","abc")
>>> m.groups()
('c',)

我的意思是,不是+僅僅意味着一個或多個。 如果是這樣,則不應該使用正則表達式([abc])+ = ([abc])([abc])+ (不是正式的BNF)。 因此,結果應為:

('a','b','c')

請闡明一些背后的機制,謝謝。

PS

我想學習正則表達式語言解釋器,該如何開始? 書籍或正則表達式版本,謝謝!

基本上,正則表達式術語中所指的groups是regex中定義的捕獲組。

因此,例如,在'([abc])+' ,只有一個捕獲組,即([abc]) ,而在類似'([abc])([xyz])+' ,有2個組。

因此,在您的示例中,調用.groups()將始終返回長度為1的元組,因為這是您的正則表達式中存在多少個組。

它未返回預期結果的原因是因為您在組使用了重復運算符+ 最終導致該組僅等於最后一個匹配項 ,因此僅保留了最后一個匹配項( c )。 另一方面,如果您使用了'([abc]+)' (請注意+ 捕獲組中),則結果應為:

('abc',)

一對分組括號構成一個分組,即使它在一個量詞中也是如此。 如果某個組由於量詞而多次匹配,則僅保存該組的最后一個匹配項。 該組的數量沒有匹配的組那么多。

好吧,我想一張圖片值得一千個字:

正則表達式可視化

鏈接到演示

發生的是,正如您在自動機的視覺表示中看到的那樣,您的正則表達式將一個字符分組一次或多次,直到到達比賽結束為止。 然后,最后一個角色進入群組。

如果要獲得您說的輸出,則需要執行以下操作:

([abc])([abc])([abc])

正則表達式可視化

它將在每個位置匹配並分組一個字符。

關於文檔,我建議您先閱讀NFA和正則表達式的理論。 關於該主題的MIT文檔非常不錯:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM