正则式 REGEX - Python re library
建立日期: 2021/12/10
修改日期: None
平台
- WIN10
- Python 3.9.9
基本常识
- 字符串 str 和 字节 bytes 不可以混用
- 正则式使用与 Python 同样的脱离字符, 所以尽可能使用原始字符串 (raw string) 来代表正则式 r’…’
特殊字母
特殊字符 | 含义 |
---|---|
. | 没 re.DOTALL, 代表任意字母, 不包含换行字母 (‘\n’). 有 re.DOTALL, 代表任意字母, 也包含换行字母 (‘\n’). |
^ | 没 re.MULTILINE, 代表字符串的开始处. 有 re.MULTILINE, 代表字符串的每一行的开始处. |
$ | 没 re.MULTILINE, 代表字符串的结束处或最后为换行字母 (‘\n’) 前处. 有 re.MULTILINE, 代表字符串的每一行的结束处或换行字母 (‘\n’) 前处. |
* | 匹配前一项内容零次以上, 该项为贪婪匹配 (greedy), 尽可能匹配更多次的. 比如使用 r’<.*>’ 来匹配字符串 ‘<abc><abc>’, 会得到 ‘<abc><abc>’, 而不是 ‘<abc>’. |
+ | 匹配前一项内容一次以上, 该项为贪婪匹配, 尽可能匹配更多次的. |
? | 匹配前一项内容零次或一次, 该项为贪婪匹配, 尽可能匹配更多次的. |
*?, +?, ?? | 改变匹配次数的方式为非贪婪匹配 (non-greedy), 尽可能匹配较少次的. 比如使用 r’<.*?>’ 来匹配字符串 ‘<abc><abc>’, 会得到 ‘<abc>’, 而不是 ‘<abc><abc>’. |
{m,n} | 匹配前一项内容至少 m 次以上, 至多 n 次, 该项为贪婪匹配, 尽可能匹配更多次的, 如果 m 或 n 省略, 则等同 0 或 无穷大. |
{m,n}? | 改变匹配次数的方式为非贪婪匹配, 尽可能匹配较少次的. |
\ | 脱离字符, 将特殊字符改为一般字符, 或者某些特殊的用词. |
[ ] | 字符集, 指定所有可以匹配字符的单一字符, 如十六进位数字 [0123456789abcdefABCDEF]. 如果两字符中间加上 ‘-‘, 代表一个连续的范围, 如十六进位数字 [0-9a-zA-Z]. 特殊字符在这里将代表一般的字符. 字符类可以在这里使用. |
[^ ] | 字符集, 指定不匹配的字符集. |
| | 匹配左边的, 如果不匹配, 再匹配右边的, 相当于 “或”. |
( ) | 定义某一区块的匹配为一个群组, 该群组可以 \编号 在正则式中代表匹配相同的内容, 编号从1开始, 最大为99. |
(? ) | 代表一种扩充的功能, ? 后面的第一个字符代表其功能, 除了 (?P…) 以外, 这不是一个群组 |
(?aiLmsux) | 设置各项设定, 应该放在正则表达式最前面, 每个文字对应的是 re.A, re.I, re.L, re.M, re.S, re.U, re.X 设定 |
(?: ) | 代表以括号分隔的一个群组, 不过这个群组不能被引用, 也不能在匹配后被获取 |
(?aiLmsux-imsx: ) | 设置或移除各项设定 |
(?P<name>) | 设置群组的匹配, 并以 name 为该群组名称, 可以使用 (?P=name), \编号 来引用, 在取代的字符串时, 可以用 \g<name>, \g<1>, \1 来引用 |
(?P=name) | 引用该名称的群组, 以匹配相同的内容 |
(?# ) | 注解 |
(?= ) | positive lookahead assertion 先行断言, 如果后面也匹配才会匹配, 其本身并不消耗任何字符串 |
(?! ) | negative lookahead assertion 前瞻断言, 如果后面不匹配才会匹配, 其本身并不消耗任何字符串 |
(?<= ) | positive lookbehind assertion 正面回顾断言, 如果前面也匹配才会匹配, 必须使用固定长度的内容 |
(?<! ) | negative lookbehind assertion 否定回顾断言, 如果前面不匹配才会匹配, 必须使用固定长度的内容 |
(?(id/name) yes-pattern |no-pattern) |
如果该群组有匹配到, 使用 yes-pattern 来匹配, 否则使用 no-pattern, 后者可以省略 |
\编号 | 引用该编号的群组, 以匹配相同的内容 |
\A | 字符串的起点 |
\b | 匹配空字符串, 指的是字的前后, 或在字与字的间隔 |
\B | 匹配空字符串, 但不在字的前后, 或不在字与字的间隔 |
\d | 匹配任何十进制数字符 [0-9] |
\D | 匹配任何非十进制数字符 [^0-9] |
\s | 匹配任何空白字符 [ \t\n\r\f\v] |
\S | 匹配任何非空白字符 [^ \t\n\r\f\v] |
\w | 匹配任何字母, 数字和下划线 [a-zA-Z0-9_] |
\W | 匹配任何非字母数字和下划线 [^a-zA-Z0-9_] |
\Z | 字符串的终点 |
正则式中的各项设定
设置 | 正则式设置 | 说明 |
---|---|---|
re.A re.ASCII |
(?a) | 对 \w, \W, \b, \B, \d, \D, \s, \S 只匹配 ASCII 字符 |
re.U re.UNICODE |
(?u) | 对 \w, \W, \b, \B, \d, \D, \s, \S 可匹配 UNICODE 字符 (Python 3 中已经没必要使用) |
re.I re.IGNORECASE |
(?i) | 大小写字母视为相同 |
re.L re.LOCALE |
(?L) | 对 \w, \W, \b, \B, 大小写不同, 视当前语言环境而定, 该标志只适用于位元组正则式, 不建议使用, 因为使用当前语言环境机制是很不可靠的. |
re.M re.MULTILINE |
(?m) | 对 ‘^’, ‘$’ 字符串的开头及末尾匹配模式, 改为多行的各行匹配模式 |
re.S re.DOTALL |
(?s) | 对 ‘.’ 的除换行符外匹配任意字符模式, 改为全部都匹配模式 |
re.X re.VERBOSE |
(?x) | 对正则式的格式, 可以随意编排; 除了在集合字符中,或者在前面加上未转义的反斜杠时, 或*?, (?:, (?P< > 之中, 其他的空白字符都会被勿略, 可以加空格, 换行, 加 # 后面变注解 |
re.DEBUG | 显示有关编译表达式的除错信息. |
正则式的函数及正则式对象的方法
经编译生成的正则式的对象, 可以重复使用, 也更有效率, 并且提供参数 flags 以利各项设定, 设定之间使用 Python 的 | (OR) 运算子以合并使用.
import re
regex = re.compile(pattern, flags=0)
正则式的函数 正则式对象的方法 |
说明 |
---|---|
re.search(pattern, string, flags=0) regex.search(string[, pos[, endpos]]) |
在 string 中, 找到第一个匹配 pattern 的位置, 匹配时返回一个 match 对象, 无法匹配则返回 None |
re.match(pattern, string, flags=0) regex.match(string[, pos[, endpos]]) |
在 string 中, pattern 的匹配位置必须是 string 的开头, 匹配时返回一个 match 对象, 无法匹配则返回 None |
re.fullmatch(pattern, string, flags=0) regex.fullmatch(string[, pos[, endpos]]) |
string 要完全匹配 pattern, 匹配时返回一个 match 对象, 无法匹配则返回 None |
re.split(pattern, string, maxsplit=0, flags=0) regex.split(string, maxsplit=0) |
以匹配 pattern 的每一段子字符串来分割字符串 string, 非零整 maxsplit 为最多分割次数数 , 为零则全部分割, 所有的群组都会在输出的列表中 |
re.findall(pattern, string, flags=0) regex.findall(string[, pos[, endpos]]) |
不重叠的所有匹配的子字符串, 无群组, 返回字符串的列表, 单一群组, 返回群组字符串的列表, 多群组则返回字符串元组的列表, 没有匹配的则返回空列表 |
re.finditer(pattern, string, flags=0) regex.finditer(string[, pos[, endpos]]) |
不重叠的所有匹配 match 对象迭代器 |
re.sub(pattern, repl, string, count=0, flags=0) regex.sub(repl, string, count=0) |
在 string 不重叠的所有匹配, 以 repl 取代前面的 count 个, count 为 0 代表全部取代, 返回替换后的字符串 repl 可以是字符串, 其中反斜线的脱离动作会被引用, 特别是代表某个群组的, 如 \2 或 \g<2> repl 可以是函数, 传入匹配对象, 返回供替换的字符串 |
re.subn(pattern, repl, string, count=0, flags=0) regex.subn(repl, string, count=0) |
类似 re.sub, 但返回一个串元组 (替换后的字符串, 替换的次数) |
re.escape(pattern) | 替换一般的字符串为带有脱离字符的正则式字符串, 不适用于 repl 的字符串 |
re.purge() | 清除正则式的缓存 |
regex.flags | 正则式的匹配旗标 |
regex.groups | 在 pattern 中所找到的群数 |
regex.groupindex | 符号群名(?P<id>)对应到群编号的字典 |
regex.pattern | 正则式的 pattern |
re.error(msg, pattern=None, pos=None) | exception 的相关属性 - msg 未格式化的错误讯息 - pattern 正则式的 pattern - pos 在 pattern 中, 错误的位置索引, 有可能是 None - lineno 对应 pos 中的行号, 有可能是 None - colno 对应 pos 中的列号, 有可能是 None |
Match 对象的属性
属性 | 说明 |
---|---|
group([group1, …]) | 返回匹配的字符串, 或匹配群组的 tuple; 没有参数, 视为0, 返回全部匹配的字符串; 如果某一个参数为0, 则该部份返回全部匹配的字符串; 如果为负数或大于最大的群组数, 会产生 IndexError; 如果某群组没有匹配, 则返回 None; 如果该群组被匹配多次, 则返回最后一个; 也可以使用群组名. |
__getitem__(g) | 可以使用索引的方式, 返回单一群组匹配的结果 |
groups(default=None) | 返回全部匹配群组的 tuple; default 指定没有匹配到的群组预设值. |
groupdict(default=None) | 返回群组名对应匹配结果的字典; default 指定没有匹配到的群组预设值. |
start([group]) end([group]) |
返回群组匹配的字符串索引, 没有匹配到则返回 -1; group 预设为 0, 指全部匹配的最前和最后的索引; ; 如果为负数或大于最大的群组数, 会产生 IndexError. |
span([group]) | 返回 (m.start(group), m.end(group)) |
pos | 匹配被设置的索引起点 |
endpos | 匹配被设置的索引终点 |
lastindex | 最终被匹配的群组索引, 没有匹配的则返回 None |
lastgroup | 最终被匹配的群组名, 没有匹配的群组名则返回 None |
re | 正则式的对象 |
string | 进行匹配的字符串 |
本作品采用《CC 协议》,转载必须注明作者和本文链接