Python下正規表示式學習筆記

Gavin_fault發表於2016-05-14

用途

正規表示式可以

  • 測試字串內的模式

  • 替換文字

  • 基於模式匹配從字串中提取子字串

RegEx語法

正規表示式(Regular Expression, RegEx)通過單個字串來匹配一系列符合此語法規則的目標字串。

元字元以及其在RegEx中的行為說明列表:

元字元 行為
^ 匹配輸入字串開始的位置。如果設定了 RegExp 物件的 Multiline 屬性,^ 還會與“n”或“r”之後的位置匹配。
$ 匹配輸入字串結尾的位置。如果設定了 RegExp 物件的 Multiline 屬性,$ 還會與“n”或“r”之前的位置匹配。
* 零次或多次匹配前面的字元或子表示式。例如,zo 匹配“z”和“zoo”。 等效於 {0,}。
+ 一次或多次匹配前面的字元或子表示式。例如,“zo+”與“zo”和“zoo”匹配,但與“z”不匹配。+ 等效於 {1,}。
? 零次或一次匹配前面的字元或子表示式。例如,“do(es)?”匹配“do”或“does”中的“do”。? 等效於 {0,1}。
{n} n 是非負整數。正好匹配 n 次。例如,“o{2}”與“Bob”中的“o”不匹配,但與“food”中的兩個“o”匹配。
{n,} n 是非負整數。至少匹配 n 次。例如,“o{2,}”不匹配“Bob”中的“o”,而匹配“foooood”中的所有 o。“o{1,}”等效於“o+”。“o{0,}”等效於“o*”。
{n,m} M 和 n 是非負整數,其中 n <= m。匹配至少 n 次,至多 m 次。例如,“o{1,3}”匹配“fooooood”中的頭三個 o。`o{0,1}` 等效於 `o?`。注意:您不能將空格插入逗號和數字之間。
? 當此字元緊隨任何其他限定符(*、+、?、{n}、{n,}、{n,m})之後時,匹配模式是“非貪心的”。“非貪心的”模式匹配搜尋到的、儘可能短的字串,而預設的“貪心的”模式匹配搜尋到的、儘可能長的字串。例如,在字串“oooo”中,“o+?”只匹配單個“o”,而“o+”匹配所有“o”。
. 匹配除“n”之外的任何單個字元。若要匹配包括“n”在內的任意字元,請使用諸如“[sS]”之類的模式。
(pattern) 匹配 pattern 並捕獲該匹配的子表示式。可以使用 $0…$9 屬性從結果“匹配”集合中檢索捕獲的匹配。若要匹配括號字元 ( ),請使用“(”或者“)”。
(?:pattern) 匹配 pattern 但不捕獲該匹配的子表示式,即它是一個非捕獲匹配,不儲存供以後使用的匹配。這對於用“or”字元組合模式部件的情況很有用。
(?=pattern) 執行正向預測先行搜尋的子表示式,該表示式匹配處於匹配 pattern 的字串的起始點的字串。它是一個非捕獲匹配,即不能捕獲供以後使用的匹配。
(?!pattern) 執行反向預測先行搜尋的子表示式,該表示式匹配不處於匹配 pattern 的字串的起始點的搜尋字串。它是一個非捕獲匹配,即不能捕獲供以後使用的匹配。
[xyz] 字符集。匹配包含的任一字元。例如,“[abc]”匹配“plain”中的“a”。
[^] 反向字符集。匹配未包含的任何字元。
[a-z] 字元範圍。匹配指定範圍內的任何字元。例如,“[a-z]”匹配“a”到“z”範圍內的任何小寫字母。
b 匹配一個字邊界,即字與空格間的位置。例如,“erb”匹配“never”中的“er”,但不匹配“verb”中的“er”。
B 非字邊界匹配。“erB”匹配“verb”中的“er”,但不匹配“never”中的“er”。
cx 匹配 x 指示的控制字元。例如,cM 匹配 Control-M 或回車符。x 的值必須在 A-Z 或 a-z 之間。如果不是這樣,則假定 c 就是“c”字元本身。
d 數字字元匹配。等效於 [0-9]。
D 非數字字元匹配。
f 換頁符匹配。等效於 x0c 和 cL。
n 換行符匹配。等效於 x0a 和 cJ。
r 匹配一個回車符。等效於 x0d 和 cM。
s 匹配任何空白字元,包括空格、製表符、換頁符等。與 [ fnrtv] 等效。
S 匹配任何非空白字元。
t 製表符匹配。與 x09 和 cI 等效。
v 垂直製表符匹配。與 x0b 和 cK 等效。
w 匹配任何字類字元,包括下劃線。與“[A-Za-z0-9_]”等效。
W 與任何非單詞字元匹配。
num 匹配 num,此處的 num 是一個正整數。到捕獲匹配的反向引用。例如,“(.)1”匹配兩個連續的相同字元。

表格轉載自 Microsoft部落格:正規表示式語法

RegEx用法例項

說明 正規表示式
電子郵件(Email) w+([-+.]w+)@w+([-.]w+).w+([-.]w+)*
QQ號碼 [1-9]d{4,}
密碼(由數字/大寫字母/小寫字母/標點符號組成,四種都必有,8位以上) (?=^.{8,}$)(?=.d)(?=.W+)(?=.[A-Z])(?=.[a-z])(?!.n).$
漢字(字元) [u4e00-u9fa5]
中文及全形標點符號(字元) [u3000-u301eufe10-ufe19ufe30-ufe44ufe50-ufe6buff01-uffee]
中國大陸手機號碼 1d{10}
中國大陸郵政編碼 [1-9]d{5}
中國大陸身份證號(15位或18位) d{15}(dd[0-9xX])?
非負整數(正整數或零) d+
正整數 0-9]*[1-9*
負整數 -0-9]*[1-9*
整數 -?d+
小數 (-?d+)(.d+)?
不包含abc的單詞 b((?!abc)w)+b

表格節選自 常用正規表示式

Memo:上面部分的模式,例如在Vim編輯器的find模式(/)下,無法進行匹配。

Python中常見的RegEx用法

為了避免上述部分模式無法匹配的問題,實際操作的時候以參考文件(RE python2)為準。

如果要替換一個字串中的某個模式,如下:

import re
txt = [the text for processing]
regex = [your regular expression]
string = [your string to replace the others]
data, number = re.subn(re.compile(regex), string, txt)
# or you could use
data, number = re.subn(regex, string, txt)

模組中還有其他常用方法:

當然,官方文件中還介紹了直接使用re的方法和使用re.compile()之後再進行正則的區別。具體請參考這裡

Weiming Hu


2016/6/13 續

感謝好東西傳送門機器學習日報的推薦,我瞭解到了北京知識圖譜學習小組第一次線下活動中關於正則學習閱讀資料,在這裡收藏並分享。

相關文章