正則表達(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ū)別對待
示 例:

