Python正則表達式
雖然Python字元串提供了眾多實用的函數,但實際處理字元串時,常常需要更強大的工具。鑒於此,Python提供了一種用於複雜字元串處理的微型語言—正則表達式,但正則表達式並不是Python的一部分。
正則表達式是用於處理字元串的強大工具,擁有自己獨特的語法以及一個獨立的處理引擎,效率上可能不如str自帶的方法,但功能十分強大。實際上,正則表達式是一種簡練描繪一組字元串的方式,可用於高效地執行常見的字元串處理任務,如匹配、替換和分拆字元串。
使用正則表達式編寫一些邏輯驗證非常方便,如:電子郵件及電話號碼的格式驗證。Python提供了re模塊實現正則表達式的驗證。
1、正則表達式的構成
- 正則表達式是包含元字元(metacharacter)的列表。
- Python支持的正則表達式元字元和語法
模式字元串使用特殊的語法來表示一個正則表達式:
- 字母和數字表示他們自身。一個正則表達式模式中的字母和數字匹配同樣的字元串。
- 多數字母和數字前加一個反斜杠時會擁有不同的含義。
- 標點符號只有被轉義時才匹配自身,否則它們表示特殊的含義。
- 反斜杠本身需要使用反斜杠轉義。
由於正則表達式通常都包含反斜杠,所以你最好使用原始字元串來表示它們。模式元素(如 r ,等價於 )匹配相應的特殊字元。
下表列出了正則表達式模式語法中的特殊元素。如果你使用模式的同時提供了可選的標誌參數,某些模式元素的含義會改變。
模式描述^匹配字元串的開頭$匹配字元串的末尾。.匹配任意字元,除了換行符,當re.DOTALL標記被指定時,則可以匹配包括換行符的任意字元。[...]用來表示一組字元,單獨列出:[amk] 匹配 a,m或k[^...]不在[]中的字元:[^abc] 匹配除了a,b,c之外的字元。re*匹配0個或多個的表達式。re+匹配1個或多個的表達式。re?匹配0個或1個由前面的正則表達式定義的片段,非貪婪方式re{ n}匹配n個前面表達式。。例如,"o{2}"不能匹配"Bob"中的"o",但是能匹配"food"中的兩個o。re{ n,}精確匹配n個前面表達式。例如,"o{2,}"不能匹配"Bob"中的"o",但能匹配"foooood"中的所有o。"o{1,}"等價於"o+"。"o{0,}"則等價於"o*"。re{ n, m}匹配 n 到 m 次由前面的正則表達式定義的片段,貪婪方式ab(re)匹配括弧內的表達式,也表示一個組(?imx)正則表達式包含三種可選標誌:i, m, 或 x 。隻影響括弧中的區域。(?-imx)正則表達式關閉 i, m, 或 x 可選標誌。隻影響括弧中的區域。(?: re)類似 (...), 但是不表示一個組(?imx: re)在括弧中使用i, m, 或 x 可選標誌(?-imx: re)在括弧中不使用i, m, 或 x 可選標誌(?#...)注釋.(?= re)前向肯定界定符。如果所含正則表達式,以 ... 表示,在當前位置成功匹配時成功,否則失敗。但一旦所含表達式已經嘗試,匹配引擎根本沒有提高;模式的剩餘部分還要嘗試界定符的右邊。(?! re)前向否定界定符。與肯定界定符相反;當所含表達式不能在字元串當前位置匹配時成功(?>re)匹配的獨立模式,省去回溯。w匹配字母數字及下劃線W匹配非字母數字及下劃線s匹配任意空白字元,等價於 [
f].S匹配任意非空字元d匹配任意數字,等價於 [0-9].D匹配任意非數字A匹配字元串開始匹配字元串結束,如果是存在換行,只匹配到換行前的結束字元串。z匹配字元串結束G匹配最後匹配完成的位置。匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, er 可以匹配"never" 中的 er,但不能匹配 "verb" 中的 er。B匹配非單詞邊界。erB 能匹配 "verb" 中的 er,但不能匹配 "never" 中的 er。
, , 等.匹配一個換行符。匹配一個製表符。等1...9匹配第n個分組的內容。10匹配第n個分組的內容,如果它經匹配。否則指的是八進位字元碼的表達式。
2、re模塊中一些重要函數
函 數描 述compile(pattern[, flags])根據包含正則表達式的字元串創建模式對象search(pattern, string[, flags])在字元串中查找模式match(pattern, string[, flags])在字元串的開始處匹配模式split(pattern, string)根據模式的匹配項來分割字元串findall(pattern. String)列出字元串中模式的所有匹配項sub(pat, repl, string[. Count=0])將字元串中所有pat的匹配項用repl替換escape(string)將字元串中所有特殊正則表達式字元轉義
3、re模塊中匹配對象的重要方法
方 法描 述group([group1, …])獲取給定子模式(組)的匹配項start([group])返回給定組的匹配項的開始位置end([group])返回給定組的匹配項的結束位置(與分片一樣,不包括組的結束位置)span([group])返回一個組的開始和結束位置
執行結果:
例:編寫一個程序,從鍵盤輸入若干字元串,當輸入done或quit則結束程序。
- 通常的方法為:
執行結果:
- 使用正則表達式用戶輸入done或quit結束程序:
執行結果:
例:假設要識別逗人的字元串:開頭為一個或多個』ha』,末尾為一個或多個』!』
執行結果:
說明:本函數如果不使用正則表達式,將非常麻煩。
4、關於正則表達式的說明
- Python的re模塊規模龐大,其中有大量正則表達式函數可用於執行字元串處理任務,如匹配、分拆和替換;還有提高常用正則表達式處理速度的技巧,以及眾多匹配常用字元的捷徑。
- re模塊的文檔可參見:https://docs.python.org/3/library/re.html
推薦閱讀: