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"。要匹配 CR 字符后跟 LF,请使用 "\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+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 及以上表示每个捕获组。仅支持数字编号的分组。