pythonRegex進階用法

來源:互聯網
上載者:User

Regex是一個以簡單直觀的方式匹配指定文本資訊從而達到尋找、替換等操作的目的。Regex以其簡單而高效的特點使得其在資料分析和資料驗證方面應用廣泛。

對於簡單的Regex可以直接百度之,這裡重點引薦下‘特殊’操作。


1.非貪婪模式 - {x,y}?

非貪婪模式是指在使用正則匹配時,儘可能少的匹配(預設是貪婪模式,即:儘可能多的匹配)。例:

>>> re.search(r'[\d]{2,5}?','091234568')

<_sre.SRE_Match object; span=(0, 2), match='09'>

在這裡{2,5}?匹配只是匹配2-5個[\d]時只要滿足2(最少的)個就好,在看看貪婪模式:

>>> re.search(r'[\d]{2,5}','091234568')

<_sre.SRE_Match object; span=(0, 5), match='09123'>

這時候,匹配2-5個[\d]時,預設匹配最多的5個。

注意:貪婪和非貪婪模式的區別就是重複操作符後有沒有。字元


2.分組

Regex提供了一個機制將運算式分組,匹配的結果也將按照運算式單獨分組。例:

>>> m = re.search(r'(\d{3})-(\d{5})','029-25642')

>>> m.group()

'029-25642'

>>> m.groups()

('029', '25642')

>>> m.group(2)

'25642'

可以通過m.groups()看到分組匹配結果,通過m.group(index)查看具體編號的分組結果(編號從1開始,0是完整的匹配)。那分組有什麼用呢,好像也沒什麼特殊的含義,不急,下面會用到。


3.引用分組(回溯) - \N

有這麼一種情況,比如假設我要找出一個html文本中的所有<a></a>標籤,怎麼辦。試試這樣:

>>> re.search(r'<(\w+)>.+</(\w+)>','<a>this is a demo</e>')

<_sre.SRE_Match object; span=(0, 21), match='<a>this is a demo</e>'>

奇怪的事情來了,為什麼<a></e>被匹配成功了,顯然結果並不是想要的,那怎麼才能只匹配<a></a>而過濾掉其他的呢(比如<a></e>)。答案就是引用分組,例:

>>> re.search(r'<(\w+)>.+</\1>','<a>this is a demo</e><p>demo two</p>')

<_sre.SRE_Match object; span=(21, 36), match='<p>demo two</p>'>

這裡\1是關鍵,意思就是當前位置匹配的結果需要和第一個分組匹配的結果一致,或者說第一個分組的匹配結果期望在這裡再次出現。以此類推。該方法最多隻能匹配前99個分組。


4.分組命名 - (?P<name>.*)

分組命名最開始由python引入,比如Django路由中會用到。分組命名的好處是方便,直接使用名字比編號要簡單而且不會變化,例:

>>> m = re.search(r'(?P<first_name>\d{3})-(?P<second_name>\d{4})','029-8967')

>>> m.group('first_name')

'029'

>>> m.groupdict()

{'first_name': '029', 'second_name': '8967'}

當然,命名分組仍然是編號分組,依然可以使用編號進行尋找分組。


5.先行斷言 - X(?!Y)、X(?=Y)

假設有這麼一種情況,要尋找所有163信箱的文本,也就是@163.com結尾的所有email帳號資訊,也就是說不要@163.com這部分,但是其還要參與匹配。這就用到了先行斷言,也即基於之後的內容是否存在接收或拒絕一個匹配,而不需要接下來的內容作為匹配的一部分。例:

>>> re.search(r'h(?!e)','hello home!')

<_sre.SRE_Match object; span=(6, 7), match='h'>

h(?!e)表示匹配h,而且h後面不能是e,此處匹配成功的是home,但是只返回h

>>> re.search(r'h(?=e)','hello home!')

<_sre.SRE_Match object; span=(0, 1), match='h'>

h(?=e)表示匹配he,此處匹配成功的是hello,但是只返回h


6.標記

不區分大小寫:re.IGNORECASE(簡寫re.I)-使得Regex不區分大小寫

點匹配分行符號:re.DOTALL(簡寫re.S)-使得 . 符號可以匹配分行符號

多行模式:re.MULTILINE(簡寫re.M)-使得^$字元可以匹配任意行的開始與結束

詳細模式:re.VERBOSE(簡寫re.X)-使得Regex可以換行書寫,且可以加入注釋

偵錯模式:re.DEBUG-將調試資訊輸出到sys.stderr

使用多個標記時,使用|分隔,如re.S|re.M

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.