Python正則表達(dá)式高級(jí)使用方法匯總
正則表達(dá)式是一個(gè)以簡(jiǎn)單直觀的方式匹配指定文本信息從而達(dá)到查找、替換等操作的目的。正則表達(dá)式以其簡(jiǎn)單而高效的特點(diǎn)使得其在數(shù)據(jù)分析和數(shù)據(jù)驗(yàn)證方面應(yīng)用廣泛。
對(duì)于簡(jiǎn)單的正則表達(dá)式可以直接百度之,這里重點(diǎn)引薦下‘特殊'操作。
1.非貪婪模式 - {x,y}?
非貪婪模式是指在使用正則匹配時(shí),盡可能少的匹配(默認(rèn)是貪婪模式,即:盡可能多的匹配)。例:
>>> re.search(r'[\d]{2,5}?','091234568')
<_sre.SRE_Match object; span=(0, 2), match='09'>
在這里{2,5}?匹配只是匹配2-5個(gè)[\d]時(shí)只要滿足2(最少的)個(gè)就好,在看看貪婪模式:
>>> re.search(r'[\d]{2,5}','091234568')
<_sre.SRE_Match object; span=(0, 5), match='09123'>
這時(shí)候,匹配2-5個(gè)[\d]時(shí),默認(rèn)匹配最多的5個(gè)。
注意:貪婪和非貪婪模式的區(qū)別就是重復(fù)操作符后有沒有?字符
2.分組
正則表達(dá)式提供了一個(gè)機(jī)制將表達(dá)式分組,匹配的結(jié)果也將按照表達(dá)式單獨(dú)分組。例:
>>> m = re.search(r'(\d{3})-(\d{5})','029-25642') >>> m.group() '029-25642' >>> m.groups() ('029', '25642') >>> m.group(2) '25642'
可以通過m.groups()看到分組匹配結(jié)果,通過m.group(index)查看具體編號(hào)的分組結(jié)果(編號(hào)從1開始,0是完整的匹配)。那分組有什么用呢,好像也沒什么特殊的含義,不急,下面會(huì)用到。
3.引用分組(回溯) - \N
有這么一種情況,比如假設(shè)我要找出一個(gè)html文本中的所有<a></a>標(biāo)簽,怎么辦?試試這樣:
>>> 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>被匹配成功了,顯然結(jié)果并不是想要的,那怎么才能只匹配<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是關(guān)鍵,意思就是當(dāng)前位置匹配的結(jié)果需要和第一個(gè)分組匹配的結(jié)果一致,或者說第一個(gè)分組的匹配結(jié)果期望在這里再次出現(xiàn)。以此類推。該方法最多只能匹配前99個(gè)分組。
4.分組命名 - (?P<name>.*)
分組命名最開始由python引入,比如Django路由中會(huì)用到。分組命名的好處是方便,直接使用名字比編號(hào)要簡(jiǎn)單而且不會(huì)變化,例:
>>> 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'}
當(dāng)然,命名分組仍然是編號(hào)分組,依然可以使用編號(hào)進(jìn)行查找分組。
5.先行斷言 - X(?!Y)、X(?=Y)
假設(shè)有這么一種情況,要查找所有163信箱的文本,也就是@163.com結(jié)尾的所有email賬號(hào)信息,也就是說不要@163.com這部分,但是其還要參與匹配。這就用到了先行斷言,也即基于之后的內(nèi)容是否存在接收或拒絕一個(gè)匹配,而不需要接下來的內(nèi)容作為匹配的一部分。例:
>>> 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.標(biāo)記
- 不區(qū)分大小寫:re.IGNORECASE(簡(jiǎn)寫re.I)-使得正則表達(dá)式不區(qū)分大小寫
- 點(diǎn)匹配換行符:re.DOTALL(簡(jiǎn)寫re.S)-使得 . 符號(hào)可以匹配換行符
- 多行模式:re.MULTILINE(簡(jiǎn)寫re.M)-使得^$字符可以匹配任意行的開始與結(jié)束
- 詳細(xì)模式:re.VERBOSE(簡(jiǎn)寫re.X)-使得正則表達(dá)式可以換行書寫,且可以加入注釋
- 調(diào)試模式:re.DEBUG-將調(diào)試信息輸出到sys.stderr
- 使用多個(gè)標(biāo)記時(shí),使用|分隔,如re.S|re.M
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python網(wǎng)絡(luò)爬蟲精解之正則表達(dá)式的使用說明
- python正則表達(dá)式re.search()的基本使用教程
- Python中正則表達(dá)式對(duì)單個(gè)字符,多個(gè)字符和匹配邊界等使用
- python使用正則表達(dá)式匹配txt特定字符串(有換行)
- python中使用正則表達(dá)式將所有符合條件的字段全部提取出來
- Python使用正則表達(dá)式實(shí)現(xiàn)爬蟲數(shù)據(jù)抽取
- Python如何使用正則表達(dá)式爬取京東商品信息
- python使用正則表達(dá)式去除中文文本多余空格,保留英文之間空格方法詳解
- python使用正則表達(dá)式(Regular Expression)方法超詳細(xì)
- python 正則表達(dá)式的使用
相關(guān)文章
selenium自動(dòng)化測(cè)試簡(jiǎn)單準(zhǔn)備
本文主要介紹了selenium自動(dòng)化測(cè)試簡(jiǎn)單準(zhǔn)備,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01python dict 相同key 合并value的實(shí)例
今天小編就為大家分享一篇python dict 相同key 合并value的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01詳細(xì)解讀Python的web.py框架下的application.py模塊
這篇文章主要介紹了Python的web.py框架下的application.py模塊,作者深入分析了web.py的源碼,需要的朋友可以參考下2015-05-05win10系統(tǒng)配置GPU版本Pytorch的詳細(xì)教程
這篇文章主要介紹了win10系統(tǒng)配置GPU版本Pytorch,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Django調(diào)用百度AI接口實(shí)現(xiàn)人臉注冊(cè)登錄代碼實(shí)例
這篇文章主要介紹了Django調(diào)用百度AI接口實(shí)現(xiàn)人臉注冊(cè)登錄,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04