Python正規表示式詳解

2020-07-16 10:05:24
正規表示式,又稱規則表示式(Regular Expression),是使用單個字串來描述、匹配某個句法規則的字串,常被用來檢索、替換那些符合某個模式(規則)的文字。最初的正規表示式出現於理論電腦科學的自動控制理論和形式化語言理論中。

1950 年,數學家斯蒂芬·科爾·克萊尼利用稱之為“正則集合”的數學符號來描述此模型。肯·湯普遜將此符號系統引入編輯器 QED,隨後是 UNIX 上的編輯器 ed,並最終引入 grep。自此以後,正規表示式被廣泛地應用於各種 UNIX 或類 UNIX 系統的工具中。目前,許多程式設計語言都支援利用正規表示式進行字串操作。

一個正規表示式通常被稱為一個模式(pattern),是用來描述或者匹配一系列匹配某個句法規則的字串。例如 Polish、Spanish 和 Swedish 這三個字串,都可以由(Pol|Span|Swed)ish 這個模式來描述。

大部分正規表示式的形式都有如下的結構:

1) 選擇

豎線|表示選擇,具有最低優先順序,例如 center|centre 可以匹配 center 或 centre。

2) 數量限定

字元後的數量限定符用來限定前面這個字元允許出現的個數。最常見的數量限定符包括“+”“?”和“*”(不加數量限定則代表出現一次且僅出現一次):
  • 加號+代表前面的字元必須至少出現一次(一次或多次),例如 goo+gle 可以匹配 google、gooogle、goooogle 等。
  • 問號代表前面的字元最多只可以出現一次(零次或一次),例如 colou?r 可以匹配 color 或者 colour。
  • 星號*代表前面的字元可以不出現,也可以出現一次或者多次(零次、一次或多次),例如 0*42 可以匹配 42、042、0042、00042 等。

3) 匹配

成對的小括號( )用來定義操作符的範圍和優先度,例如 gr(a|e)y 等效於 gray|grey,(grand)?father 匹配 father 和 grandfather。

正規表示式中除了上述的幾種特殊字元外,還使用了一些特殊的方式表示匹配的模式,常用的特殊字元及含義如表 1 所示。

表 1:正規表示式常用的特殊字元及含義
符號 描述
將下一個字元標記為一個特殊字元、一個原義字元(Identity Escape,有 "^"  "$"  "("   ")"  "*"  "+"  "{"  "|" 共計12個)、一個向後參照(backreferences)或一個八進位制跳脫符。例如“n”匹配字元“n”,“n”匹配一個換行符,“”匹配“”,“(”則匹配“(”