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"。要匹配 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.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()所使用的替换函数。