[英]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')
請闡明一些背后的機制,謝謝。
我想學習正則表達式語言解釋器,該如何開始? 書籍或正則表達式版本,謝謝!
基本上,正則表達式術語中所指的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.