文章插圖

文章插圖
大多數編程語言的正則表達式設計都師從Perl,所以語法基本相似,不同的是每種語言都有自己的函數去支持正則,今天我們就來學習 Python中關于 正則表達式的函數 。
注:為避免出現代碼格式錯亂,豬哥盡量使用代碼截圖演示哦 。
聊到Python正則表達式的支持,首先肯定會想到
re庫,這是一個Python處理文本的標準庫 。標準庫的意思表示這是一個Python內置模塊,不需要額外下載,目前Python內置模塊大概有300個 。可以在這里查看Python所有的內置模塊:https://docs.python.org/3/py-modindex.html#cap-r因為re是內置模塊,所以不需要再下載,使用時直接引入即可:
import rere模塊官方文檔:https://docs.python.org/zh-cn/3.8/library/re.htmlre模塊庫源碼:https://github.com/python/cpython/blob/3.8/Lib/re.py
常量即表示不可更改的變量,一般用于做標記 。
re模塊中有9個常量,常量的值都是int類型!
1. IGNORECASE
語法:re.IGNORECASE 或簡寫為 re.I
作用:進行忽略大小寫匹配 。
代碼案例:
2. ASCII
語法:re.ASCII 或簡寫為 re.A
作用:顧名思義,ASCII表示ASCII碼的意思,讓
w,W,b,B,d,D,s和S只匹配ASCII,而不是Unicode 。代碼案例:
w+匹配到了所有字符串,而在ASCII模式下,只匹配到了a、b、c(ASCII編碼支持的字符) 。注意:這只對字符串匹配模式有效,對字節匹配模式無效 。
3. DOTALL
語法:re.DOTALL 或簡寫為 re.S
作用:DOT表示
.,ALL表示所有,連起來就是.匹配所有,包括換行符n 。默認模式下.是不能匹配行符n的 。代碼案例:
.并沒有匹配換行符n,而是將字符串分開匹配;而在re.DOTALL模式下,換行符n與字符串一起被匹配到 。注意:默認匹配模式下
.并不會匹配換行符n 。4. MULTILINE
語法:re.MULTILINE 或簡寫為 re.M
作用:多行模式,當某字符串中有換行符
n,默認模式下是不支持換行符特性的,比如:行開頭 和 行結尾,而多行模式下是支持匹配行開頭的 。代碼案例:
^表示匹配行的開頭,默認模式下它只能匹配字符串的開頭;而在多行模式下,它還可以匹配 換行符n后面的字符 。注意:正則語法中
^匹配行開頭、A匹配字符串開頭,單行模式下它兩效果一致,多行模式下A不能識別n 。5. VERBOSE
語法:re.VERBOSE 或簡寫為 re.X
作用:詳細模式,可以在正則表達式中加注解!
代碼案例:
當一個正則表達式十分復雜的時候,詳細模式或許能為你提供另一種注釋方式,但它不應該成為炫技的手段,建議謹慎考慮后使用!
6.LOCALE
語法:re.LOCALE 或簡寫為 re.L
作用:由當前語言區域決定
w,W,b,B和大小寫敏感匹配,這個標記只能對byte樣式有效 。這個標記官方已經不推薦使用,因為語言區域機制很不可靠,它一次只能處理一個 “習慣”,而且只對8位字節有效 。注意:由于這個標記官方已經不推薦使用,而且豬哥也沒使用過,所以就不給出實際的案例!
7.UNICODE
語法:re.UNICODE 或簡寫為 re.U
作用:與 ASCII 模式類似,匹配unicode編碼支持的字符,但是 Python 3 默認字符串已經是Unicode,所以有點冗余 。
8. DEBUG
語法:re.DEBUG
作用:顯示編譯時的debug信息 。
代碼案例:
9.TEMPLATE
語法:re.TEMPLATE 或簡寫為 re.T
作用:豬哥也沒搞懂TEMPLATE的具體用處,源碼注釋中寫著:disable backtracking(禁用回溯),有了解的同學可以留言告知!
9個常量中,前5個(IGNORECASE、ASCII、DOTALL、MULTILINE、VERBOSE)有用處,兩個(LOCALE、UNICODE)官方不建議使用、兩個(TEMPLATE、DEBUG)試驗性功能,不能依賴 。
常量在re常用函數中都可以使用,查看源碼可得知 。
|符號,請勿使用+符號!re模塊有12個函數,豬哥將以功能分類來講解;這樣更具有比較性,同時也方便記憶 。
1.查找一個匹配項
查找并返回一個匹配項的函數有3個:search、match、fullmatch,他們的區別分別是:
search: 查找任意位置的匹配項match: 必須從字符串開頭匹配fullmatch: 整個字符串與正則完全匹配
我們再來根據實際的代碼案例比較:
案例1:
而match函數是要從頭開始匹配,而字符串開頭多了個字母
a,所以無法匹配,fullmatch函數需要完全相同,故也不匹配!案例2:
案例3:
完整案例:
2.查找多個匹配項
講完查找一項,現在來看看查找多項吧,查找多項函數主要有:findall函數與finditer函數:
findall: 從字符串任意位置查找,返回一個列表finditer:從字符串任意位置查找,返回一個迭代器
兩個方法基本類似,只不過一個是返回列表,一個是返回迭代器 。我們知道列表是一次性生成在內存中,而迭代器是需要使用時一點一點生成出來的,內存使用更優 。
3.分割
re.split(pattern, string, maxsplit=0, flags=0)函數:用pattern分開 string ,maxsplit表示最多進行分割次數,flags表示模式,就是上面我們講解的常量!
關于二者的速度如何? 豬哥實際測試了一下,在相同數據量的情況下使用
re.split函數與str.split函數執行次數與執行時間對比圖:str.split函數更快,而循環次數1000次以上后re.split函數明顯更快,而且次數越多差距越大!所以結論是:在 不需要正則支持 且 數據量和數次不多 的情況下使用
str.split函數更合適,反之則使用re.split函數 。注:具體執行時間與測試數據有關!
4.替換
替換主要有sub函數與subn函數,他們功能類似!
先來看看sub函數的用法:
re.sub(pattern, repl, string, count=0, flags=0)函數參數講解:repl替換掉string中被pattern匹配的字符, count表示最大替換次數,flags表示正則表達式的常量 。
值得注意的是:sub函數中的入參:repl替換內容既可以是字符串,也可以是一個函數哦!如果repl為函數時,只能有一個入參:Match匹配對象 。
compile函數 與 template函數將正則表達式的樣式編譯為一個 正則表達式對象 (正則對象Pattern),這個對象與re模塊有同樣的正則函數(后面我們會講解Pattern正則對象) 。
re.escape(pattern) 可以轉義正則表達式中具有特殊含義的字符,比如:
.或者*,舉個實際的案例:re.purge 函數作用就是清除 正則表達式緩存,具體有什么緩存呢?我們來看看源碼就知道它背地里干了 什么:
同樣,最后來一張思維導圖總結一下re模塊中的函數吧,需要高清圖或者xmind文件的同學可在末尾獲取 。
re模塊還包含了一個正則表達式的編譯錯誤,當我們給出的正則表達式是一個無效的表達式(就是表達式本身有問題)時,就會raise一個異常!
我們來看看具體的案例吧:
注意:這個異常一定是 正則表達式 本身是無效的,與要匹配的字符串無關!
關于
re模塊的常量、函數、異常我們都講解完畢,但是完全有必要再講講正則對象Pattern 。1. 與re模塊 函數一致
在
re模塊的函數中有一個重要的函數compile函數,這個函數可以預編譯返回一個正則對象,此正則對象擁有與re模塊相同的函數,我們來看看Pattern類的源碼 。而且,有些同學可能看過
re模塊的源碼,你會發現其實compile函數與 其他re函數(search、split、sub等等) 內部調用的是同一個函數,最終還是調用正則對象的函數!# re函數re.search(pattern, text)# 正則對象函數compile = re.compile(pattern)compile.search(text)那還有必要使用compile函數得到正則對象再去調用search函數嗎?直接調用re.search 是不是就可以?2. 官方文檔怎么說
關于到底該用re模塊還是正則對象Pattern,官方文檔是否有說明呢?
3. 實際測試又如何?
上面官方文檔推薦我們在 多次使用某個正則表達式時使用正則對象,那實際情況真的是這樣的嗎?
我們再實測一下吧
得出的結果豬哥繪制成折線圖:
通過實際測試得知:Python 官方文檔推薦 多次使用某個正則表達式時使用正則對象函數 基本屬實!
注意事項
Python 正則表達式知識基本講解完畢,最后稍微給大家提一提需要注意的點 。
1.字節串 與 字符串
模式和被搜索的字符串既可以是 Unicode 字符串 (str) ,也可以是8位字節串 (bytes) 。但是,Unicode 字符串與8位字節串不能混用!
2.r 的作用
正則表達式使用反斜杠(’’)來表示特殊形式,或者把特殊字符轉義成普通字符 。
而反斜杠在普通的 Python 字符串里也有相同的作用,所以就產生了沖突 。
解決辦法是對于正則表達式樣式使用 Python 的原始字符串表示法;在帶有 ‘r’ 前綴的字符串字面值中,反斜杠不必做任何特殊處理 。
3.正則查找函數 返回匹配對象
查找一個匹配項(search、match、fullmatch)的函數返回值都是一個 匹配對象Match,需要通過match.group獲取匹配值,這個很容易忘記 。
4.重復使用某個正則
如果要重復使用某個正則表達式,推薦先使用 re.compile(pattern)函數返回一個正則對象,然后復用這個正則對象,這樣會更快!
5.Python 正則面試
【python正則表達式應用舉例 正則表達式測試工具代碼】筆試可能會遇到需要使用Python正則表達式,不過不會太難的,大家只要記住那幾個方法的區別,會正確使用,基本問題不大 。
- 【君子不邢則不發.意思是不是說相形的五行要是吉神,如正官正印正則或相邢的五行?】正官合身坐祿用神
- Python適合高中生學習嗎?扶對于面相就業這種情況【python面向對象三大特性】
- 上古密約侯正則是妖嗎,侯正則結局是怎樣的
- 打開cmd,如何用cmd打開python文件
- “c 面相對象調用“python,c,c的區別
- 光合作用的化學式表達式_光合作用的化學反應表達式
- Python適合高中生學習嗎?扶對于面相就業這種情況 python 面相對象 選課系統
- p語言是python嗎_python中是什么意思
