正则表达式是一个特殊的字符序列,用于方便地检查一个字符串是否与某种模式匹配。例如按照“20XX-XX-XX”提取日期、按照“XXX@XXX.XXX”提取电子邮件等。
Python的re模块提供了Perl风格的正则表达式模式。本章节主要介绍几种常用的正则表达式处理函数。
一、re模块常用函数
首先,我们给定一个字符串即匹配模板:
import retext = "Tel: 010-12345678, 021-87654321"pattern = r"\d{3,4}-\d{7,8}" # 区号-号码
注意,正则匹配模板字符串以引号外的“r”开头,若不加“r”则当作普通字符串进行字符串查找匹配。我们以上述内容为例,列举re模块中几个函数的调用方法及结果:
功能 | 调用示例 | 返回结果 |
匹配字符串是否符合正则模板的格式。 | re.match(pattern, text) | None。由于从起始位置匹配成功,返回None;否则返回匹配位置。 |
查找字符串中是否存在匹配正则模板的子串。 | re.search(pattern, text) | <re.Match>对象,返回第一个匹配子串的信息,span属性为该子串的起始终止位置,match属性为该子串。 |
给出字符串中所有匹配正则模板的子串。 | re.findall(pattern, text) | ['010-12345678', '021-87654321'] |
使用给定字符串,替换原字符串中符合正则模板的子串。 | re.sub(pattern, “****”, text) | Tel: *****, ***** |
将原字符串中匹配正则模板的子串找出并返回该列表。 | re.split(pattern, text) | ['Tel: ', ', ', ''] |
编译产生一个正则表达式对象,提供给match等函数使用。 | pat=re.compile(pattern) pat.findall(text) | ['010-12345678', '021-87654321'] |
二、正则语法
在正则表达式中,为了实现需要的模板,可以使用以下的符号用于匹配目标字符串:
符号 | 含义 |
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
. | 匹配任意字符,除换行符,当制定re.DOTALL标记,可匹配换行符 |
[…] | 用于匹配一组字符,如[ak47]匹配‘a’、‘k’、‘4’或‘7’ |
[^…] | 用于不匹配一组字符,如[^amd]匹配‘a’、‘m’、‘d’以外字符 |
* | 匹配0个或多个字符,如a*表示匹配大于等于0个‘a’ |
+ | 匹配1个或多个字符,如a+表示匹配大于等于1个‘a’ |
? | 匹配0个或1个字符 |
a|b | 匹配字符a或b |
\d | 匹配1个任意数字,介于0到9 |
\D | 匹配1个任意非数字 |
\w | 匹配1个字母、数字或下划线 |
\W | 匹配1个非字母、数字或下划线 |
\s | 匹配1个空白字符,等价于\t、\n、\r或\f |
\S | 匹配1个非空白字符 |
\b | 匹配1个单词边界,如er\b匹配‘never’而非‘verb’中的‘er’ |
\B | 匹配1个非单词边界 |
\n, \t | 匹配换行符或制表符 |
{n} | 精确匹配n次大括号前字符(串),如a{2}匹配‘aa’ |
{n, m} | 精确匹配n至m次大括号前字符(串) |
(group) | 对表达式进行分组匹配,可用group()函数按分组索引提取 |
…… |
三、举例
我们来举几个正则表达式的字符串模板例子:
# 提取邮箱地址pattern = r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b"# 提取日期时间pattern = r"\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}"# 提取网址 URLpattern = r"https?://[^\s]+"# 提取被 - 分隔的 3 个数字pattern = r"(\d+)-(\d+)-(\d+)"
四、修饰符(flags)
模块re中的函数通常包含一个flags参数,用于对匹配过程进行额外的控制:
修饰符 | 作用 |
re.IGNORECASE (re.I) | 忽略大小写 |
re.MULTILINE (re.M) | “^”和“$”匹配每一行开头或结尾 |
re.DOTALL (re.S) | 允许“.”匹配换行符 |
re.VERBOSE (re.X) | 允许正则中加注释和空白 |
如果同时使用多个修饰符,可以使用“|”进行连接,如“re.I | re.S”。
往期回顾:
一起来用OpenCV-Python搞图像处理 | Part.2
Python学习笔记——从入门到报废(二十九、面向对象编程(五))