L05-06_正則表達(dá)式

正則表達(dá)式概念

· 概 念

? · 正則表達(dá)式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規(guī)則字符串”,這個“規(guī)則字符串”用來表達(dá)對字符串的一種過濾邏輯。

· 正則表達(dá)式的應(yīng)用場景

? ?· 表單驗證(例如:手機(jī)號、郵箱、身份證...)

? ?· 爬 蟲


正則表達(dá)式對Python的支持

· 普通字符

? ?· 字母、數(shù)字、漢字、下劃線以及沒有特殊定義的符號,都是“普通字符”。

? ?· 正則表達(dá)式中的普通字符,在匹配的時候,只匹配與自身相同的一個字符

? ?· 例如:表達(dá)式c,在匹配字符串‘a(chǎn)bcde’,匹配結(jié)果是:成功;匹配到得內(nèi)容是c

? ? ? ? ? ? ? ? 匹配到的位置開始于2,結(jié)束于3.

? ? ? ? ? ? ?(注:下標(biāo)從0開始還是1開始,因當(dāng)前編程語言不同而可能不同)

· match( ) 函數(shù)

· match(pattern, string, flags=0)

? ` 第一個參數(shù)時正則表達(dá)式,如果匹配成功,則返回一個match對象,否則返回一個None

? · 第二個參數(shù)表示要匹配的字符串

? · 第三個參數(shù)時標(biāo)志位用于控制正則表達(dá)式的匹配方式,如:是否區(qū)分大小寫,多行匹配等等


· 補(bǔ)充:安裝jupyter (方便檢驗正則表達(dá)式功能)

? ?1. win+R, 在cmd中先將pip升級到最新版本:

? ? ? ? pip3 install --upgrade pip

? ?2. 換源安裝jupyter:?

? ? ? ? pip install jupyter -i?https://pypi.douban.com/simple/

以下鏡像源均可使用:

?? ? ? ? ?· 豆瓣:https://pypi.douban.com/simple/

? ? ? ? ? · 阿里:https://mirrors.aliyun.com/pypi/simple/

?? ? ? ? ?· 中國科學(xué)技術(shù)大學(xué):https://pypi.mirrors.ustc.edu.cn/simple

? ? ? ? ? · 清華:https://pypi.tuna.tsinghua.edu.cn/simple

? 3. 需要運行時,win+R,進(jìn)入cmd命令行程序,鍵入:

jupyter notebook

? 4. 自動打開頁面,如下:


? 5. 創(chuàng)建新的Python 3代碼:

6. 開始在 jupyter上編寫Python 3 代碼:


· 元字符

? ?正則表達(dá)式中使用了很多元字符,用來表示一些特殊的含義或功能


? ?一些無法書寫或者具有特殊功能的字符,采用在前面加反斜杠 " \ " 進(jìn)行轉(zhuǎn)義的方法:

? ?例如下表所示:

尚未列出的還有問號?、星號*和括號等其它的符號。所有正則表達(dá)式中具有特殊含義的字符在匹配自身的時候,都要用反斜杠 “ \ ” 進(jìn)行轉(zhuǎn)義。這些轉(zhuǎn)義字符的匹配用法與普通字符類似,也是匹配與之相同的一個字符


· 預(yù)定義匹配字符集

? ?正則表達(dá)式中的一些表示方法,可以同時匹配某個預(yù)定義字符集中的任意一個字符。比如,表達(dá)式 \d 可以匹配任意一個數(shù)字。雖然可以匹配其中任意字符,但是只能是一個,不是多個。

反集不列舉,可自行嘗試

· 重復(fù)匹配

? ?全面的表達(dá)式,無論是只能匹配一種字符的表達(dá)式,還是可以匹配多種字符,還是可以匹配多種字符其中任意一個的表達(dá)式,都只能匹配一次。但也有需要對某個字段進(jìn)行重復(fù)匹配的需求,例如手機(jī)號碼13666666666,重復(fù)匹配 \d\d\d\d\d\d\d\d\d\d\d, 表達(dá)式?jīng)]錯,但是是否有更簡潔準(zhǔn)確表達(dá)方式?

這種情況可以使用表達(dá)式再加上修飾匹配次數(shù)的特殊符號 { },不但重復(fù)書寫表達(dá)式就可以重復(fù)匹配。

例如 [abcd][abcd] 可以寫成 [abcd]{2}

· 位置匹配和非貪婪匹配

? ?· 位置匹配

? ? 對匹配出現(xiàn)的位置有要求,比如開頭、結(jié)尾、單詞之間等

· 貪婪與非貪婪模式

? ?在重復(fù)匹配時,正則表達(dá)式默認(rèn)總是盡可能多地匹配,這被稱為貪婪模式。

不帶問號 (?) 的貪婪模式
帶問號 (?) 的非貪婪模式

? ? ?例如,針對文本dxxxdxxxd,表達(dá)式(d)(\w+)(d)中的\w+將匹配第一個d和最后一個d之間的所有字符xxxdxxx。

? ? ?可見,\w+在匹配的時候,總是盡可能多的匹配符合它規(guī)則的字符。

? ? ?同理,帶有?、*和{m,n}的重復(fù)匹配表達(dá)式都是盡可能地多匹配

? ? ?校驗數(shù)字的相關(guān)表達(dá)式:

? ? ?特殊場景的表達(dá)式:

? · Re模塊常用方法

? ? ?compile(pattern, flags=0)

? ? ? ?這個方法是re模塊的工廠法,將字符串形式的正則表達(dá)式編譯為Pattern模式對象,可以實現(xiàn)更加效率的匹配。第二個參數(shù)flag是匹配模式 使用compile()完成一次轉(zhuǎn)換后,再次使用該匹配模式的時候就不能進(jìn)行轉(zhuǎn)換了。經(jīng)過compile()轉(zhuǎn)換的正則表達(dá)式對象也能使用普通的re方法

flag匹配模式


? ? ? search(pattern, string, flags=0)

? ? ? ? 在文本內(nèi)查找,返回第一個匹配到的字符串。它的返回值類型和使用方法與match()是一樣的,

? ? ? ? 唯一的區(qū)別就是查找的位置不用固定在文本的開頭


? ? ? findall(pattern, string, flags=0)

? ? ? ?作為re模塊的三大搜索函數(shù)之一,findall()和match()、search()的不同之處在于,

? ? ? ?前兩者都是單值匹配,找到一個就忽略后面,直接返回不再查找了。

? ? ? ?而 findall 是全文查找,它的返回值是一個匹配到的字符串的列表。

? ? ? ?這個列表沒有g(shù)roup()方法,沒有start、end、span,更不是一個匹配對象,僅僅是個列表!

? ? ? ?如果一項都沒有匹配到那么返回一個空列表

? ? ? sub(pattern, repl, string, count=0, flags=0)

? ? ? ?sub()方法類似字符串的replace()方法,用指定的內(nèi)容替換匹配到的字符,可以指定替換次數(shù)


?分組功能

? ? ? ?Python的re模塊有一個分組功能。所謂的分組就是去已經(jīng)匹配到的內(nèi)容再篩選出需要的內(nèi)容,相當(dāng)于二次過濾。

? ? ? 實現(xiàn)分組靠圓括號(),而獲取分組的內(nèi)容靠的是group()、groups(),其實前面我們已經(jīng)展示過。

? ? ? re模塊里的這個重要方法在分組上,有不同的表現(xiàn)形式,需要區(qū)別對待


示 例:


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容