正規表示式(RegEx)是一系列字元,形成了一個搜尋模式。RegEx 可用於檢查字串是否包含指定的搜尋模式。
RegEx 模組
Python 中有一個內建的包叫做 re,它可以用於處理正規表示式。匯入 re 模組:
import re
Python 中的 RegEx,一旦匯入了 re 模組,您就可以開始使用正規表示式了。
示例:搜尋字串以檢視它是否以 "The" 開頭並以 "Spain" 結尾:
import re
txt = "The rain in Spain"
x = re.search("^The.*Spain$", txt)
RegEx 函式
re 模組提供了一組函式,允許我們在字串中搜尋匹配項:
函式 描述
findall 返回包含所有匹配項的列表
search 如果字串中的任何位置存在匹配項,則返回一個 Match 物件
split 返回一個列表,其中字串已在每個匹配項處拆分
sub 用字串替換一個或多個匹配項
元字元
元字元是具有特殊含義的字元:
字元 描述 示例
[] 一組字元 "[a-m]"
\ 表示特殊序列(也可以用於轉義特殊字元) "\d"
. 任何字元(除換行符之外的任何字元) "he..o"
^ 以...開始 "^hello"
$ 以...結束 "planet$"
- 零次或多次出現 "he.*o"
- 一次或多次出現 "he.+o"
? 零次或一次出現 "he.?o"
{} 指定次數的出現次數 "he.{2}o"
| 要麼是...,要麼是... "falls|stays"
() 捕獲和分組
特殊序列
特殊序列是一個 \ 後面跟著下面列表中的一個字元,具有特殊含義:
字元 描述 示例
\A 如果指定的字元位於字串的開頭,則返回一個匹配項 "\AThe"
\b 返回指定字元在單詞的開頭或結尾的匹配項
(開頭的 "r" 確保字串被視為“原始字串”) r"\bain"
r"ain\b"
\B 返回指定字元存在但不在單詞的開頭(或結尾)的匹配項
(開頭的 "r" 確保字串被視為“原始字串”) r"\Bain"
r"ain\B"
\d 返回字串包含數字(0-9)的匹配項 "\d"
\D 返回字串不包含數字的匹配項 "\D"
\s 返回字串包含空白字元的匹配項 "\s"
\S 返回字串不包含空白字元的匹配項 "\S"
\w 返回字串包含任何單詞字元的匹配項(從 a 到 Z,從 0 到 9,以及下劃線 _ 字元) "\w"
\W 返回字串不包含任何單詞字元的匹配項 "\W"
\Z 如果指定的字元位於字串的末尾,則返回一個匹配項 "Spain\Z"
集合
集合是一個放在一對方括號 [] 中的一組字元,具有特殊含義:
集合 描述
[arn] 返回一個匹配項,其中存在指定的字元(a、r 或 n)
[a-n] 返回任何小寫字元的匹配項,字母順序在 a 和 n 之間
[^arn] 返回除 a、r 和 n 之外的任何字元的匹配項
[0123] 返回字串中存在任何指定的數字(0、1、2 或 3)的匹配項
[0-9] 返回字串中存在任何數字(0 到 9)的匹配項
[0-5][0-9] 返回字串中存在任何兩位數的匹配項,介於 00 和 59 之間
[a-zA-Z] 返回任何字母字元的匹配項,字母順序在 a 到 z 之間,不區分大小寫
[+] 在集合中,+、*、.、|、()、$、{} 沒有特殊含義,因此 [+] 意味著:返回字串中的任何 + 字元的匹配項
findall() 函式
findall() 函式返回一個包含所有匹配項的列表。
示例:列印所有匹配項的列表:
import re
txt = "The rain in Spain"
x = re.findall("ai", txt)
print(x)
該列表按照找到的順序包含匹配項。如果沒有找到匹配項,則返回一個空列表:
示例:如果未找到匹配項,則返回一個空列表:
import re
txt = "The rain in Spain"
x = re.findall("Portugal", txt)
print(x)
search() 函式
search() 函式在字串中搜尋匹配項,如果有匹配項,則返回一個 Match 物件。如果有多個匹配項,只會返回第一個匹配項:
示例:搜尋字串中的第一個空格字元:
import re
txt = "The rain in Spain"
x = re.search("\s", txt)
print("第一個空格字元位於位置:", x.start())
如果沒有找到匹配項,則返回值為 None:
示例:進行一個不會返回匹配項的搜尋:
import re
txt = "The rain in Spain"
x = re.search("Portugal", txt)
print(x)
split() 函式
split() 函式返回一個列表,其中字串已在每個匹配項處拆分:
示例:在每個空格字元處拆分:
import re
txt = "The rain in Spain"
x = re.split("\s", txt)
print(x)
您可以透過指定 maxsplit 引數來控制出現的次數:
示例:僅在第一個匹配項處拆分字串:
import re
txt = "The rain in Spain"
x = re.split("\s", txt, 1)
print(x)
sub() 函式
sub() 函式用您選擇的文字替換匹配項:
示例:用數字 9 替換每個空格字元:
import re
txt = "The rain in Spain"
x = re.sub("\s", "9", txt)
print(x)
您可以透過指定 count 引數來控制替換的次數:
示例:替換前兩個匹配項:
import re
txt = "The rain in Spain"
x = re.sub("\s", "9", txt, 2)
print(x)
Match 物件
Match 物件是一個包含有關搜尋和結果的資訊的物件。
注意:如果沒有匹配項,將返回值 None,而不是 Match 物件。
示例:執行一個將返回 Match 物件的搜尋:
import re
txt = "The rain in Spain"
x = re.search("ai", txt)
print(x) # 這將列印一個物件
Match 物件具有屬性和方法,用於檢索有關搜尋和結果的資訊:
.span()
返回一個包含匹配項的起始位置和結束位置的元組。.string
返回傳遞給函式的字串。.group()
返回字串中存在匹配項的部分。
示例:列印第一個匹配項的位置(起始位置和結束位置)。正規表示式查詢以大寫字母 "S" 開頭的任何單詞:
import re
txt = "The rain in Spain"
x = re.search(r"\bS\w+", txt)
print(x.span())
示例:列印傳遞給函式的字串:
import re
txt = "The rain in Spain"
x = re.search(r"\bS\w+", txt)
print(x.string)
示例:列印存在匹配項的字串部分。正規表示式查詢以大寫字母 "S" 開頭的任何單詞:
import re
txt = "The rain in Spain"
x = re.search(r"\bS\w+", txt)
print(x.group())
最後
為了方便其他裝置和平臺的小夥伴觀看往期文章:公眾號搜尋Let us Coding
,或者掃描下方二維碼,關注公眾號,即可獲取最新文章。
看完如果覺得有幫助,歡迎點贊、收藏和關注