字元匹配
反斜槓\.*
+?{}正規表示式(regular expressions 也稱為 res,或 regexes 或 regex patterns)本質上是乙個微小的且高度專業化的程式語言。它被嵌入到 python 中,並通過 re 模組提供給程式猿使用。使用正規表示式,你需要指定一些規則來描述那些你希望匹配的字串集合。這些字串集合可能包含英語句子、 e-mail 位址、tex 命令
python 的正規表示式引擎是用 c 語言寫的,所以效率是極高的。另,所謂的正規表示式,這裡說的 re,就是上文我們提到的「一些規則」。
大多數字母和字元會匹配它們自身。舉個例子,正規表示式dog 將完全匹配字串 「dog」,預設情況下區分大小寫。當然這個規則也有例外。有少數特殊的字元我們稱之為元字元(metacharacter),它們並不能匹配自身,它們定義了字元類、子組匹配和模式重複次數等。
下邊是元字元的完整列表:
.
^ $ *
+ ?
\ |
()
如果沒有這些元字元,正規表示式就變得跟字串的find()
方法一樣平庸了…
下方括號 [ ],它們指定乙個字元類用於存放你需要匹配的字元集合。可以單獨列出需要匹配的字元,也可以通過兩個字元和乙個橫桿- 指定匹配的範圍。例如[abc]
會匹配字元 a,b 或 c;[a-c] 可以實現相同的功能。後者使用範圍來表示與前者相同的字元集合。舉例:如果你想只匹配小寫字母,你的 re 可以寫成 [a-z]
注意:元字元在方括號中不會觸發「特殊功能」,在字元類中,它們只匹配自身。例如[akm$]
會匹配任何字元'a'
,'k'
,'m'
或'$'
,'$'
是乙個元字元,但在方括號中它不表示特殊含義,它只匹配 『$』 字元本身。
你還可以匹配方括號中未列出的所有其他字元。做法是在類的開頭新增乙個脫字符號 ^ ,例如[^5]
會匹配除了 『5』 之外的任何字元
跟 python 的字串規則一樣,如果在反斜槓後邊緊跟著乙個元字元,那麼元字元的「特殊功能」也不會被觸發。例如你需要匹配符號[
或\
,你可以在它們前面加上乙個反斜槓,以消除它們的特殊功能:\[,\\
反斜槓後邊跟一些字元還可以表示特殊的意義,例如表示十進位制數字,表示所有的字母或者表示非空白的字元集合。
反斜槓後邊跟元字元去除特殊功能,反斜槓後邊跟普通字元實現特殊功能。
舉個例子:\w
匹配任何單詞字元。如果正規表示式以位元組的形式表示,這相當於字元類[a-za-z0-9_]
;如果正規表示式是乙個字串,\w
會匹配所有unicode
資料庫(unicodedata
模組提供)中標記為字母的字元。你可以在編譯正規表示式的時候,通過提供re.ascii
表示進一步限制\w
的定義。
re.ascii
標誌使得\w
只能匹配ascii
字元,不要忘了,python3
是 unicode 的。
特殊字元
含義\d
匹配任何十進位制數字;相當於類[0-9]
\d與\d
相反,匹配任何非十進位制數字的字元;相當於類[^0-9]
\s匹配任何空白字元(包含空格、換行符、製表符等);相當於類[ \t\n\r\f\v]
\s與 \s 相反,匹配任何非空白字元;相當於類[^ \t\n\r\f\v]
\w匹配任何單詞字元,見上方解釋
\w於 \w 相反
\b匹配單詞的開始或結束
\b與 \b 相反
它們可以包含在乙個字元類中,並且一樣擁有特殊含義。例如[\s,.]
是乙個字元類,它將匹配任何空白字元(/s
的特殊含義),','
或'.'
。
另外乙個元字元是.
,它匹配除了換行符以外的任何字元。如果設定了re.dotall
標誌,.
將匹配包括換行符在內的任何字元。
我們來看看*
這個元字元,當然它不是匹配'*'
字元本身,它用於指定前乙個字元匹配零次或者多次
例如ca*t
將匹配ct
(0 個字元 a),cat
(1 個字元a
),caaat
(3 個字元 a),等等。需要注意的是,由於受到 c 語言的 int 型別大小的內部限制,正規表示式引擎會限制字元'a'
的重複個數不超過 20 億個。
正規表示式預設的重複規則是貪婪的,當你重複匹配乙個 re時,匹配引擎會嘗試盡可能多的去匹配。直到re 不匹配或者到了結尾,匹配引擎就會回退乙個字元,然後再繼續嘗試匹配
通過例子一步步的給大家講解什麼叫「貪婪」:先考慮一下表示式a[bcd]*b
,首先需要匹配字元'a'
,然後是零個到多個[bcd]
,最後以 『b』 結尾。那現在想象一下,這個 re 匹配字串abcbd
會怎樣?
步驟匹配說明1
a匹配 re 的第乙個字元 『a』
2abcbd
引擎在符合規則的情況下盡可能地匹配[bcd]*
,直到該字串的結尾3失敗
引擎嘗試匹配 re 最後乙個字元 『b』,但當前位置已經是字串的結尾,所以失敗告終
4abcb
回退,所以[bcd]*
匹配少乙個字元5失敗
再一次嘗試匹配 re 最後乙個字元 『b』,但字串最後乙個字元是 『d』,所以失敗告終
6abc
再次回退,所以[bcd]*
這次只匹配'bc'
7abcb
再一次嘗試匹配字元 『b』,這一次字串當前位置指向的字元正好是 『b』,匹配成功
re 匹配的結果是abcb
。
正規表示式預設的匹配規則是貪婪的,後邊有說如何使用非貪婪的方法匹配。
要特別注意*
和+
的區別:*
匹配的是零次或者多次,所以被重複的內容可能壓根兒不會出現;+
至少需要出現一次。例如ca+t
會匹配cat
和caaat
,但不會匹配ct
。
還有兩個表示重複的元字元,其中乙個是問號?
,用於指定前乙個字元匹配零次或者一次。你可以這麼想,它的作用就是把某種東西標誌位可選的。例如 小?魚 可以匹配 小魚,也可以匹配 魚。
最靈活的應該是元字元(m 和 n 都是十進位制整數),上邊講到的幾個元字元都可以使用它來表達,它的含義是前乙個字元必須匹配 m 次到 n 次之間。例如
a/b
會匹配a/b
,a//b
和a///b
。但不會匹配ab
(沒有斜槓);也不會匹配ab
(斜槓超過三個)。
你可以省略 m 或者 n,這樣的話,引擎會假定乙個合理的值代替。省略 m,將被解釋為下限 0;省略 n 則會被解釋為無窮大(事實上是上邊我們提到的 20 億)。
如果是 相當於 ;如果是 相當於 ;如果是 ,則是重複前乙個字元 n 次。另外還有乙個超容易出錯的是寫成 ,看著挺美,但注意,正規表示式裡邊不能隨意新增空格,不然會改變原來的含義。
其實*
、+
和?
都可以使用來代替。
跟
*
是一樣的;跟 + 是一樣的;
跟
?
是一樣的。不過還是鼓勵大家記住並使用*
、+
和?
,因為這些字元更短並且更容易閱讀。
還有乙個原因是匹配引擎對* + ?
做了優化,效率要更高些。
python正規表示式元字元 正規表示式
字元 描述將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了 regexp 物件的 multiline 屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束...
正規表示式 元字元
現在你已經知道幾個很有用的元字元了,如 b 還有 d 當然還有更多的元字元可用,比如 s 匹配任意的空白符,包括空格,製表符 tab 換行符,中文全形空格等 w匹配字母或數字或下劃線或漢字等。ba w b 匹配以字母a 開頭的單詞 先是某個單詞開始處 b 然後是字母a 然後是任意數量的字母或數字 w...
正規表示式 元字元
元字元 描述.點 匹配任何單個字元。例如正規表示式r.t匹配這些字串 rat rut r t,但是不匹配root。匹配行結束符。例如正規表示式weasel 能夠匹配字串 he s a weasel 的末尾 但是不能匹配字串 they are a bunch of weasels.匹配一行的開始。例如...