正则式 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 协议》,转载必须注明作者和本文链接
Jason Yang
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!