1. 程式人生 > 其它 >正則表示式 python

正則表示式 python

技術標籤:otherpython正則表示式字串

一、字元匹配

1.元字元: . ^ $ * + ? { } [ ] \ | ( )
2.方括號 [ ] :指定一個【字元類】,用來存放你希望匹配的字元集合。一個連續範圍內的字元也可以用橫槓‘-’連線首尾兩個字元指定。 比如,[abc]可以匹配 a,b 或 c,[a-c]也有同樣的效果。
2.1元字元在方括號內不會被啟用!比如,[akm$]可以匹配字元‘a’,‘k’, ‘m’或者’ ’ , ‘ ’,‘ ’元字元會失去它的特性,匹配自身。
2.2匹配未在方括號中列出的字元,這需要在方括號中的第一個字元前面加上‘’脫字元號,方括號字元集合之外的字元可以簡單地匹配‘
’符號。比如,[^5]可以匹配任何 不是‘5’的字元。
3.反斜槓\:如果反斜槓後面跟著一個元字元,那麼元字元的 “特殊功能”將不會被觸發。比如需要去匹配一個 [ 或者 \ ,可以在它們之前加上反 斜槓 \ 以去掉它們的特殊語義:\ [ 或者 \。
3.1有一些特殊的、常用的序列也以反斜槓開始,比如十進位制數字,或者非空白的字元集合。\w 匹配所有字母數字字元,如果正則表示式以位元組的形式表示, 這相當於字元類[a-zA-Z0-9]。如果正則表示式是一個字串,\w 會匹配所有在 Unicode 資料 庫中標記的為字母的字元。你在編譯正則表示式的時候可以通過提供 re.ASCII 標誌進一步限制 \w 的定義。下面列舉一些反斜槓加字元構成的特殊序列(並不完整)。
      \d:匹配所有十進位制數字,相當於字元類[0-9]
      \D:匹配所有非數字字元,相當於字元類[^0-9] 
      \s:匹配所有空白字元(包括製表符、換行符等),相當於字元類[\t\n\r\f\v] 
      \S:匹配所有非空白字元,相當於字元類[^\t\n\r\f\v] 
      \w:匹配所有字母數字字元,相當於字元類[a-zA-Z0-9] 
      \W:匹配所有非字母數字字元,相當於字元類[^a-zA-Z0-9]
這些序列可以被包含在一個字元類中,比如,[\s,.]是一個字元類,可以匹配任何空白字 符,或者‘,’和‘.’。

二、重複

1.元字元星號 * :它並不匹配它自身,而是指定它的前一個字元重複 0 次或者多次,而不是確定的多少次。比如,ca*t 可以匹配 ct(有 0 個 a 字元)、cat(有 1 個 a 字元)、caaat(有 3 個 a 字元) 等等。正則表 達式引擎總是先儘可能遠的匹配重複的字元,如果不匹配,他將逐步回退,然後再次嘗試去 匹配 RE 剩餘的部分,直到重複字元的個數為 0,如果這時仍然匹配失敗,引擎就會得出結 論:這個字串不匹配這個 RE。
2.元字元加號 + :它指定匹配它前面的字元 1 次或者多次。星號 * 匹配 0 次或者多次,所以被匹配的內容可能壓根兒 就不出現,但是加號 + 要求重複的字元至少出現 1 次。舉一個簡單的例子,ca+t 可以匹配 cat(1 個 a 字元)、caaat(3 個 a 字元),但是它不匹配 ct。
3.問號 ? : 它用於指定匹配它前面的字元 0 次或者 1 次,你可以認為它用於標誌一個可選的字元。比如,home-?brew 可以匹配 homebrew 或者 home-brew。
4.最靈活的表示重複的限定符: {m,n}。表示它前面的字元至少重複 m 次,最多重複 n 次。比如,a/{1,3}b 可以匹配 a/b,a//b 和 a///b。但是 它不匹配 ab,因為 ab 沒有斜槓,也不匹配 ab,因為它有 4 個斜槓超過了 3 個。省略 m 將預設下限為 0,省略 n 將預設無上限。(譯者注:還有一種使用方式,{n}指定它前面的字元重複 n 次,{0,}與星號 * 作用一樣,{1,}與加號 + 作用一樣,{0,1}與問號 ? 作用一樣。然而,在實際應用中,首選星號 * 、加號 + 和問號 ? ,因為它們更短,效率更高

三、更多的元字元

1.“I”或操作符:如果 A 和 B 都是正則表示式,A|B 將匹配任何能夠匹配 A 或者 B 的字串。 為了讓或操作符 | 在多字元的字串匹配中工作地更加合理,它的優先順序很低,例如 Crow | Servo 將會匹配 Crow 或者 Servo,而不是 Cro 然後[w] or [S]。
如果需要匹配字元‘|’,使用 |,或者將它放在一個字元類中,[|]。
2.“^”:匹配一行的開頭位置。如果沒有設定 MULTILINE 標誌,它只匹配字串的開頭位置,如果設定了 MULTILINE 標誌,它將匹配字串中每一行(根據換行符)的開頭。舉個例子,如果你只想在一行的開頭位置匹配 From 這個單詞,這個正則表示式應該是 ^From。
3.“$”:匹配一行的結尾,它每當遇到換行符也會進行匹配。
4.\A:只匹配字串的開始位置。如果不在 MULTILINE 模式下,\A 和 ^ 的有一樣的效果。在 MULTILINE 模式下,它們是不一樣的:\A 還是隻匹配字串的開頭,而 ^ 將匹配字串每 一行的開頭,即每一個換行符之後也會進行匹配。
5.\Z: 只匹配字串的結尾。
6.\b: 單詞邊界。這是一個零寬斷言,只匹配一個單詞的開始位置或者結束位置。單詞是由字母或者數字構成的序列,所以一個單詞由空格或者非字母數字字元作為結束標誌。下述例子只有當 class 作為單獨的一個完整單詞的時候才會被匹配,當 class 是其他單詞的一部分時不會被匹配。
7.\B: 這個零寬斷言與\b 的意義相反,它匹配非單詞邊界。

四、RE模組

1.匹配一個反斜槓字元‘\’,你需要寫四個反斜槓‘\\。解決方法是使用Python中的原始字串,即在字串最前面加上字母 r,這樣字串中的反斜槓都會被去掉特殊語義,看做普通字元。比如,字串 r”\n” 是 包含‘\’和‘n’兩個字元的字串,而字串 “\n” 是隻有一個換行符的字串。正則表示式通常使用 Python 中的原始字串來表示。
匹配物件例項也有一些方法和屬性,這裡列出最重要的幾個:
match()方法是判斷正則表示式是否從開始處匹配字串,所以start()方法總是返回 0。然而,search()方法就不一樣了,它掃描整個字串,匹配的子字串的開始位置不一定是 0。
findall()方法需要在它返回結果之前創建出整個列表。但是finditer()方法將匹配物件作為迭代器返回(譯者注:迭代器的方式更節省記憶體,效率更高)。
2.模組級別的函式:
不需要去建立一個匹配物件來呼叫它的方法,re 模組中也提供一些全域性函式比如 match()、search()、findadd()、sub()等等。這些函式的第一個引數是正則表示式字串,其他引數跟模式物件同名的方法採用一樣的引數,返回值也一樣,都是返回 None。由於內部緩衝機制,兩者的效率不差上下。