re --- 簡單的正規表示式

本模組實作正規表示式運算。所支援的正規表示式語法是 CPython re 模組的子集(實際上也是 POSIX 延伸正規表示式的子集)。

支援的運算子與特殊序列如下:

.

比對任意字元。

[...]

比對字元集合。支援個別字元與範圍,包括反向集合(例如 [^a-c])。

^

比對字串的開頭。

$

比對字串的結尾。

?

比對前一個子模式零次或一次。

*

比對前一個子模式零次或多次。

+

比對前一個子模式一次或多次。

??

? 的非貪婪版本,比對零次或一次,並優先選擇零次。

*?

* 的非貪婪版本,比對零次或多次,並優先選擇最短的比對結果。

+?

+ 的非貪婪版本,比對一次或多次,並優先選擇最短的比對結果。

|

比對此運算子左側或右側的子模式。

(...)

分組。每個分組都會擷取(可透過 match.group() 方法存取其所擷取的子字串)。

(?:...)

非擷取分組。每個分組使用與一般分組相同的規則進行比對,但不會成為比對物件的一部分。

\d

比對數字。等同於 [0-9]

\D

比對非數字。等同於 [^0-9]

\s

比對空白字元。等同於 [ \t-\r]

\S

比對非空白字元。等同於 [^ \t-\r]

\w

比對「文字字元」(僅限 ASCII)。等同於 [A-Za-z0-9_]

\W

比對非「文字字元」(僅限 ASCII)。等同於 [^A-Za-z0-9_]

\

跳脫字元。反斜線後接的任何其他字元(上述所列者除外)會以字面值處理。例如 \* 等同於字面的 *(不被視為 * 運算子)。請注意 \r\n 等並不會被特別處理,而會等同於字面字母 rn 等。因此,不建議在正規表示式中使用 Python 原始字串(r"")。例如 r"\r\n" 用作正規表示式時等同於 "rn"。若要比對後接 LF 的 CR 字元,請使用 "\r\n"

不支援

  • 計數重複({m,n}

  • 具名分組((?P<name>...)

  • 更進階的斷言(\b\B

  • \r\n 這類特殊字元跳脫 - 請改用 Python 本身的跳脫方式

  • 等等。

範例::

import re

# As re doesn't support escapes itself, use of r"" strings is not
# recommended.
regex = re.compile("[\r\n]")

regex.split("line1\rline2\nline3\r\n")

# Result:
# ['line1', 'line2', 'line3', '', '']

函式

re.compile(regex_str: str, flags: int = 0) 'regex'

編譯正規表示式,回傳 regex 物件。

re.search(regex_str: str, string: str) 'match | None'

編譯 regex_str 並在 string 中搜尋。與 match 不同,這會在字串中搜尋第一個符合正規表示式的位置(若正規表示式有錨定,該位置仍可能為 0)。

re.sub(regex_str: str, replace: str | Callable, string: str, count: int = 0, flags: int = 0, /) str

編譯 regex_str 並在 string 中搜尋,將所有比對結果以 replace 取代,並回傳新字串。

replace 可以是字串或函式。若為字串,則可使用 \<number>\g<number> 形式的跳脫序列展開為對應的分組(未比對到的分組則展開為空字串)。若 replace 為函式,則它必須接受單一引數(比對結果),並應回傳取代字串。

若指定了 count 且其值非零,則在進行此數量的取代後即停止取代。flags 引數會被忽略。

Regex 物件

已編譯的正規表示式。此類別的實例是使用 re.compile() 建立的。

class re.regex

re.compile() 回傳的已編譯正規表示式物件。

match(string: str, pos: int = 0, endpos: int | None = None) 'match | None'

將此已編譯的正規表示式套用至 string,錨定於搜尋區域的開頭,並回傳 match 物件;若正規表示式不符合則回傳 None。這是模組層級 match 的已編譯模式對應版本,當同一個模式套用至多個字串時效率高得多。

選用參數 pos 給出 string 中搜尋開始的索引,預設為 0。這與切片字串並不完全等同;'^' 模式字元會在字串的真正開頭以及換行符後緊接的位置進行比對,但不一定會在搜尋開始的索引處比對。

選用參數 endpos 限制 string 的搜尋範圍;其效果就如同字串長度為 endpos 個字元,因此只會搜尋從 posendpos - 1 的字元。若 endposNone(預設值),則會搜尋整個字串。

search(string: str, pos: int = 0, endpos: int | None = None) 'match | None'

掃描 string,尋找此已編譯正規表示式產生比對的第一個位置,並回傳 match 物件;若無任何位置符合則回傳 None。這是模組層級 search() 函式的已編譯模式對應版本,當同一個模式套用至多個字串時效率高得多。

選用參數 pos 給出 string 中搜尋開始的索引,預設為 0。這與切片字串並不完全等同;'^' 模式字元會在字串的真正開頭以及換行符後緊接的位置進行比對,但不一定會在搜尋開始的索引處比對。

選用參數 endpos 限制 string 的搜尋範圍;其效果就如同字串長度為 endpos 個字元,因此只會搜尋從 posendpos - 1 的字元。若 endposNone(預設值),則會搜尋整個字串。

sub(replace: str | Callable, string: str, count: int = 0, flags: int = 0, /) str

string 中搜尋此已編譯的正規表示式,將所有比對結果以 replace 取代,並回傳新字串。這是模組層級 sub() 函式的已編譯模式對應版本,當同一個模式套用至多個字串時效率高得多。

replace 可以是字串或函式。若為字串,則可使用 \<number>\g<number> 形式的跳脫序列展開為對應的分組(未比對到的分組則展開為空字串)。若 replace 為函式,則它必須接受單一引數(比對結果),並應回傳取代字串。

若指定了 count 且其值非零,則在進行此數量的取代後即停止取代。flags 引數會被忽略。

split(string: str, max_split: int = -1, /) List[str]

使用正規表示式分割 string。若給定 max_split,則指定執行分割的最大次數。回傳字串清單(若有指定 max_split,則最多可有 max_split+1 個元素)。

Match 物件

比對物件保存了一次成功比對的結果。

class re.match(regex_str: str, string: str)

regex_strstring 比對,錨定於字串開頭,並回傳比對物件;若不符合則回傳 None。這是模組層級的捷徑:re.match(regex_str, string) 等同於 re.compile(regex_str).match(string)

search()、已編譯模式的 regex.match() / regex.search() 方法也會回傳同一個比對物件,並且該物件會傳遞給 sub() 所使用的取代函式。

group(index: int) str

回傳比對到的(子)字串。index 為 0 表示整個比對結果,1 以上則對應各個擷取分組。僅支援數字分組。