1、简介

究竟什么是正则表达式 (Regular Expression) 呢?可以用下面的一句话简单概括:

正则表达式是一组特殊的 字符序列,由一些事先定义好的字符以及这些字符的组合形成,常常用于 匹配字符串

在 Python 中,re 模块 就是一个用于处理正则表达式的模块,详细信息可以参考 官方文档

另外,这里再给大家推荐一个博主常用的测试正则表达式的网站:http://tool.oschina.net/regex,不妨一试

2、特殊符号

上面说过,正则表达式实际上是由一些事先定义好的字符以及这些字符的组合形成

那么,这些特殊的字符究竟包括什么呢?它们又有怎样的含义呢?具体请看下面的讲解:

  • .:匹配除换行符之外的 所有字符

  • ^:匹配字符串的 开始位置

  • $:匹配字符串的 结束位置

  • *:匹配字符串 零次或多次,在后面加上 ? 表示启用非贪婪模式匹配(默认为贪婪模式)

  • +:匹配字符串 一次或多次,在后面加上 ? 表示启用非贪婪模式匹配(默认为贪婪模式)

  • ?:匹配字符串 零次或一次,在后面加上 ? 表示启用非贪婪模式匹配(默认为贪婪模式)

  • { }:匹配字符串 指定次

    • {M, N} 表示匹配字符串 M~N 次

    • {M,} 表示匹配字符串至少 M 次

    • {,N} 表示匹配字符串至多 N 次

    • {N} 表示匹配字符串 N 次

  • [ ]:匹配 括号内所包含的任意一个字符

    • 若连字符 (-) 出现在字符串中间则表示范围,出现在首位则作普通字符;

    • 若脱字符 (^) 出现在字符串首位则表示排除,出现在中间则作普通字符

  • ( )捕获子组,将括号中的匹配模式作为一个整体被捕获,并作为子组返回

  • (?: )非捕获子组,将括号中的匹配模式作为一个整体被捕获,但不作为子组返回

  • \b:匹配一个 单词边界,单词被定义成字母数字或下横线字符

  • \B:与 \b 相反

  • \d

    • 对于 str 类型,匹配任何 数字字符,包括 [0-9] 以及其它数字字符

    • 对于 str 类型开启 re.ASCII 标志或者 bytes 类型,只匹配 [0-9]

  • \D:与 \d 相反

  • \s

    • 对于 str 类型,匹配任何 空白字符,包括 [\t\n\r\f\v] 以及其它空白字符

    • 对于 str 类型开启 re.ASCII 标志或者 bytes 类型,只匹配 [\t\n\r\f\v]

  • \S:与 \s 相反

  • \w

    • 对于 str 类型,匹配任何 单词字符,包括 [a-zA-Z0-9_] 以及其它单词字符

    • 对于 str 类型开启 re.ASCII 标志或者 bytes 类型,只匹配 [a-zA-Z0-9_]

  • \W:与 \w 相反

下面我们来看一个简单的例子,帮助大家更好的理解正则表达式的匹配方式

匹配整数

^ 匹配开头

-? 匹配减号字符,零次或一次,对应正整数和负整数

[1-9] 匹配 1~9 之间的任意一个数字,确保整数的第一个数字不能为 0

\d* 匹配任意数字字符,零次或多次

$ 匹配结尾

^-?[1-9]\d*$

3、常用方法

(1)match(pattern, string, flags=0)

在 string 起始位置开始匹配 pattern,flags 表示标志位

若匹配成功则返回 SRE_Match 对象,若匹配不成功则返回 None 对象

_sre.SRE_Match 对象常用的方法列举如下:

  • start([group]):返回匹配开始的位置
  • end([group]):返回匹配结束的位置
  • span([group]):返回匹配的范围
  • group(num=0):返回匹配的字符串,若对象中有子组,则加上 num 参数可获取相应子组
>>> import re
>>> result = re.match(r'abc(\d+)', "abc123def456abc789")
>>> type(result)
# <class '_sre.SRE_Match'>
>>> result.start() # 查看匹配的起始位置
# 0
>>> result.end() # 查看匹配的结束位置
# 6
>>> result.span() # 查看匹配的范围
# (0, 6)
>>> result.group() # 查看匹配的字符串
# 'abc123'
>>> result.group(1) # 查看匹配的子组
# '123'

(2)search(pattern, string, flags=0)

在 string 中搜索第一次出现的 pattern,flags 表示标志位

同样的,若匹配成功则返回 SRE_Match对象,若匹配不成功则返回 None对象

>>> import re
>>> result = re.search(r'abc(\d+)', "abc123def456abc789")
>>> type(result)
# <class '_sre.SRE_Match'>
>>> result.span() # 查看匹配的范围
(0, 6)

(3)findall(pattern, string, flags=0)

在 string 中搜索所有符合条件的 pattern,flags 表示标志位

一般情况下,该方法返回匹配内容的 列表,若匹配模式中含有子组,则返回对应的子组列表

>>> import re
>>> result = re.findall(r'abc\d+', "abc123def456abc789") # 不含子组
>>> type(result)
# <class 'list'>
>>> for item in result:
print(item)
# abc123
# abc789
>>> result = re.findall(r'abc(\d+)', "abc123def456abc789") # 含有子组
>>> type(result)
# <class 'list'>
>>> for item in result:
print(item)
# 123
# 789

(4)finditer(pattern, string, flags=0)

在 string 中搜索所有符合的 pattern,flags表示标志位

一般情况下,该方法返回匹配内容的 迭代器对象

>>> import re
>>> result = re.finditer(r'abc(\d+)', "abc123def456abc789")
>>> type(result)
# <class 'callable_iterator'>
>>> for item in result:
print(item)
# <_sre.SRE_Match object; span=(0, 6), match='abc123'>
# <_sre.SRE_Match object; span=(12, 18), match='abc789'>

(5)compile(pattern, flags=0)

编译正则表达式模式为正则表达式对象

通常情况下,如果需要重复使用某个正则表达式,那么可以先将该正则表达式编译成模式对象,以下是参数说明:

  • pattern :匹配模式,建议使用原始字符串表示

  • flags :标志位,用于控制正则表达式的匹配方式,可选值如下,多个值之间用 | 分割:

    • re.I \ re.IGNORECASE:不区分大小写
    • re.L \ re.LOCALE:取决于当前语言环境
    • re.S \ re.DOTALL:使 . 匹配包括换行符在内的所有字符
    • re.M \ re.MULTILINE:使 ^ 匹配字符串的开头和每行的开头,使 $ 匹配字符串的结尾和每行的结尾

该方法返回一个 SRE_Pattern对象,该对象常用的方法如下:

  • match(string[, pos[, endpos]])

    用对象中的匹配模式匹配 string 的起始位置,该方法返回 SRE_Match 对象,用 pos 和 endpos 表示匹配的范围

  • search(string[, pos[, endpos]])

    用对象中的匹配模式匹配 string,该方法返回 SRE_Match 对象,用 pos 和 endpos 表示匹配的范围

  • findall(string[, pos[, endpos]])

    用对象中的匹配模式匹配 string,该方法返回列表,用 pos 和 endpos 表示匹配的范围

  • finditer(string[, pos[, endpos]])

    用对象中的匹配模式匹配 string,该方法返回迭代器,用 pos 和 endpos 表示匹配的范围

【参考资料】

【爬虫系列相关文章】

爬虫系列(五) re的基本使用的更多相关文章

  1. 爬虫系列(三) urllib的基本使用

    一.urllib 简介 urllib 是 Python3 中自带的 HTTP 请求库,无需复杂的安装过程即可正常使用,十分适合爬虫入门 urllib 中包含四个模块,分别是 request:请求处理模 ...

  2. 爬虫系列(九) xpath的基本使用

    一.xpath 简介 究竟什么是 xpath 呢?简单来说,xpath 就是一种在 XML 文档中查找信息的语言 而 XML 文档就是由一系列节点构成的树,例如,下面是一份简单的 XML 文档: &l ...

  3. 爬虫系列(二) Chrome抓包分析

    在这篇文章中,我们将尝试使用直观的网页分析工具(Chrome 开发者工具)对网页进行抓包分析,更加深入的了解网络爬虫的本质与内涵 1.测试环境 浏览器:Chrome 浏览器 浏览器版本:67.0.33 ...

  4. 爬虫系列(四) 用urllib实现英语翻译

    这篇文章我们将以 百度翻译 为例,分析网络请求的过程,然后使用 urllib 编写一个英语翻译的小模块 1.准备工作 首先使用 Chrome 浏览器打开 百度翻译,这里,我们选择 Chrome 浏览器 ...

  5. 爬虫系列(六) 用urllib和re爬取百度贴吧

    这篇文章我们将使用 urllib 和 re 模块爬取百度贴吧,并使用三种文件格式存储数据,下面先贴上最终的效果图 1.网页分析 (1)准备工作 首先我们使用 Chrome 浏览器打开 百度贴吧,在输入 ...

  6. 爬虫系列(七) requests的基本使用

    一.requests 简介 requests 是一个功能强大.简单易用的 HTTP 请求库,可以使用 pip install requests 命令进行安装 下面我们将会介绍 requests 中常用 ...

  7. 爬虫系列(八) 用requests实现天气查询

    这篇文章我们将使用 requests 调用天气查询接口,实现一个天气查询的小模块,下面先贴上最终的效果图 1.接口分析 虽然现在网络上有很多免费的天气查询接口,但是有很多网站都是需要注册登陆的,过程比 ...

  8. 爬虫系列(十) 用requests和xpath爬取豆瓣电影

    这篇文章我们将使用 requests 和 xpath 爬取豆瓣电影 Top250,下面先贴上最终的效果图: 1.网页分析 (1)分析 URL 规律 我们首先使用 Chrome 浏览器打开 豆瓣电影 T ...

  9. 爬虫系列(十一) 用requests和xpath爬取豆瓣电影评论

    这篇文章,我们继续利用 requests 和 xpath 爬取豆瓣电影的短评,下面还是先贴上效果图: 1.网页分析 (1)翻页 我们还是使用 Chrome 浏览器打开豆瓣电影中某一部电影的评论进行分析 ...

随机推荐

  1. jenkins下载插件失败解决办法

  2. 创建虚拟机中的nova-scheduler 调度配置

    一个Openstack 系统中通常包括多个计算节点 root@controller:/etc/nova# nova hypervisor-list +----+-------------------- ...

  3. jQuery - 制作非缘勿扰页面特效

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. QMessageBox 的四种用法

    void MainWindow::on_info_clicked() { //info QMessageBox::information(this, "Title", " ...

  5. android SearchView 样式修改

    try { Class<?> argClass=mSearchView.getClass(); //指定某个私有属性 Field mSearchHintIconField = argCla ...

  6. C# winform listBox中的项上下移动(转)

    C# winform listBox中的项上下移动 分类: C# winform2009-06-24 12:37 876人阅读 评论(0) 收藏 举报 winformc#object //上移节点   ...

  7. 【BZOJ 2252】 矩阵距离

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2252 [算法] 将所有是”1“的点入队,然后广度优先搜索,即可 [代码] #incl ...

  8. Django day17 博客项目(一)

    一: 博客项目需求分析 首页(显示文章) 文章详情 点赞, 点踩 文章评论 字评论 评论的展示 登录功能(图片验证码) 注册功能(基于form验证,ajax) 个人站点(不同人不同样式,文章过滤) 后 ...

  9. [Luogu 1850] noip16 换教室

    [Luogu 1850] noip16 换教室 好久没有更博客了,先唠嗑一会,花了两天的空闲时间大致做完了昨年的noip真题 虽然在经过思考大部分题目都可出解(天天爱跑步除外),但是并不知道考试时候造 ...

  10. Spring Boot (4) 静态页面和Thymeleaf模板

    静态页面 spring boot项目只有src目录,没有webapp目录,会将静态访问(html/图片等)映射到其自动配置的静态目录,如下 /static /public /resources /ME ...