Python正規表示式之元字元詳解(1)

2021-10-21 07:49:09 字數 4807 閱讀 8925

字元匹配

反斜槓\.*

+?{}正規表示式(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會匹配catcaaat,但不會匹配ct

還有兩個表示重複的元字元,其中乙個是問號?,用於指定前乙個字元匹配零次或者一次。你可以這麼想,它的作用就是把某種東西標誌位可選的。例如 小?魚 可以匹配 小魚,也可以匹配 魚。

最靈活的應該是元字元(m 和 n 都是十進位制整數),上邊講到的幾個元字元都可以使用它來表達,它的含義是前乙個字元必須匹配 m 次到 n 次之間。例如a/b會匹配a/ba//ba///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.匹配一行的開始。例如...