Python 正規表示式(RegEx)指南

小萬哥丶發表於2023-11-02

正規表示式(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,或者掃描下方二維碼,關注公眾號,即可獲取最新文章。

看完如果覺得有幫助,歡迎點贊、收藏關注

image

相關文章