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等並不會被特別處理,而會等同於字面字母r、n等。因此,不建議在正規表示式中使用 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.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 個字元,因此只會搜尋從 pos 到
endpos - 1的字元。若 endpos 為None(預設值),則會搜尋整個字串。
- search(string: str, pos: int = 0, endpos: int | None = None) 'match | None'¶
掃描 string,尋找此已編譯正規表示式產生比對的第一個位置,並回傳
match物件;若無任何位置符合則回傳None。這是模組層級search()函式的已編譯模式對應版本,當同一個模式套用至多個字串時效率高得多。選用參數 pos 給出 string 中搜尋開始的索引,預設為
0。這與切片字串並不完全等同;'^'模式字元會在字串的真正開頭以及換行符後緊接的位置進行比對,但不一定會在搜尋開始的索引處比對。選用參數 endpos 限制 string 的搜尋範圍;其效果就如同字串長度為 endpos 個字元,因此只會搜尋從 pos 到
endpos - 1的字元。若 endpos 為None(預設值),則會搜尋整個字串。
- sub(replace: str | Callable, string: str, count: int = 0, flags: int = 0, /) str¶
在 string 中搜尋此已編譯的正規表示式,將所有比對結果以 replace 取代,並回傳新字串。這是模組層級
sub()函式的已編譯模式對應版本,當同一個模式套用至多個字串時效率高得多。replace 可以是字串或函式。若為字串,則可使用
\<number>與\g<number>形式的跳脫序列展開為對應的分組(未比對到的分組則展開為空字串)。若 replace 為函式,則它必須接受單一引數(比對結果),並應回傳取代字串。若指定了 count 且其值非零,則在進行此數量的取代後即停止取代。flags 引數會被忽略。
Match 物件¶
比對物件保存了一次成功比對的結果。
- class re.match(regex_str: str, string: str)¶
將 regex_str 與 string 比對,錨定於字串開頭,並回傳比對物件;若不符合則回傳
None。這是模組層級的捷徑:re.match(regex_str, string)等同於re.compile(regex_str).match(string)。search()、已編譯模式的regex.match()/regex.search()方法也會回傳同一個比對物件,並且該物件會傳遞給sub()所使用的取代函式。