正则表达式

概念

正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的

模式

模式 描述
^ 匹配字符串的开头
$ 匹配字符串的末尾
. 匹配任意字符
\ 是之后的表示式失效, 仅匹配其字面字符
[...] 用来表示一组字符, 单独列出
[amk] 匹配 ‘a’, ‘m’ 或 ‘k’
[^...] 匹配不在[]中的字符
[...-...] 匹配一个范围(如果想匹配一个-, 则可以将其放在括号开头或结尾)
* 匹配 0 个或多个表达式
+ 匹配 1 个或多个表达式
? 匹配 0 个或 1 个表达式, 非贪婪方式
{n} 精确匹配 n 个表达式
{n, m} 匹配 n 到 m 次表达式, 贪婪方式( 若无 m, 如{n,}, 则匹配 n 到无穷多个表达式)
`a b`
(...) 对正则表达式分组并记住匹配的文本
(?imx...) 正则表达式包含三种可选标志: i, m 或 x; 只影响括号中的区域
(?-imx...) 正则表达式关闭 i, m 或 x 可选标志; 只影响括号中的区域
(?: ...) 类似(...), 但是不表示一个组(即不会保存该组内的数据)
(?imx:...)/(?-imx:...) 与上类似
(?# ...) 注释
(?=...) 向前肯定界定符
: exp1(?=exp2) 查找后面是 exp2 的 exp1
(?!...) 前向否定界定符, 与肯定界定符相反, 当所含表达式不能在字符串当前位置匹配时成功
: exp1(?!exp2) 查找后面不是 exp2 的 exp1
(?>...) 匹配的独立模式, 省去回溯
\s / \S \s匹配所有空白符, 包括换行(等价于[\f\n\r\t\v])
\S匹配非空白符, 不包括换行(等价于[^\f\n\r\t\v])
\w / \W \w 匹配字母, 数字, 下划线, 等价于[A-Za-z0-9_]
\W匹配非数字字母下划线
\d / \D \d匹配任意数字
\D匹配任意非数字
\A 匹配字符串开始
\z / \Z \z匹配字符串结束
\Z匹配字符串结束, 如果存在换行, 只匹配到换行前的结束字符串
\b / \B \b匹配单词边界
\B匹配非单词边界(如er\B匹配verb, 不能匹配never)
\G 匹配最后匹配完成的位置

修饰符

修饰符 含义 描述
i ignore - 不区分大小写 将匹配设置为不区分大小写
g global - 全局匹配 查找所有的匹配项
m mluti line - 多行匹配 使边界字符^$匹配每一行的开头和结尾
s 特殊字符圆点.包含换行符\n 默认情况下的.是匹配除换行符以外的任何字符, 加上修饰符后包含换行符

运算符优先级

运算符 描述
\ 转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \任何元字符、任何字符 定位点和序列(即: 位置和顺序)
| 替换,“或"操作 字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food”。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。

re 模块

Python中提供了re模块来使用正则表达式

由于在Python中的字符串本身也使用\来转义, 所以在写正则表达式的匹配pattern时, 一般加上r前缀

  1. match(pattern, str[, flags]): 判断是否匹配, 如果匹配成功, 返回一个Match对象, 否则返回None(只匹配一次, 且从字符串开头匹配)

  2. search(pattern, str[, flags]): 扫描整个字符串并返回第一个成功匹配, 返回一个Match对象(若不指定^, 则可从任意位置比较)

  3. findall(pattern, str): 找到所有匹配的字符串, 返回一个列表

  4. finditer(): 与 findall() 类似, 返回一个迭代器

  5. split(pattern, str): 使用正则表达式切分字符串

    1
    2
    3
    4
    5
    6
    # 使用内置的`split`
    >>> 'a b c'.split(' ')
    ['a', 'b', '', '', 'c']
    # 使用`re`模块的`split`
    >>> re.split(r'\s+', 'a b c')
    ['a', 'b', 'c']
  6. re.compile(pattern[, flags]): 预编译正则表达式, 生成一个Regular Expression对象, 之后匹配时只需要传入该对象进行比对

  7. re.sub(pattern, repl, str[, count=0, flags]): 将在str中匹配到的字符串替换为repl, count为替换的最大次数, 默认0为全部替换
    : repl也可以是一个函数

  8. match.group(num): 如果在正则表达式中使用了()进行了分组, 则可以通过match.group(num)来访问num组的匹配值(group(0)为原字符串)

  9. match.groups(): 返回匹配到的字符串的元组