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. 翻翻git之---溜的飞起的载入效果AVLoadingIndicatorView

    转载请注明出处:王亟亟的大牛之路 由于接近过春节.看各个群体的工作都不太旺盛(不是年会就是各种吹B或是放空). 之前的Material Design的内容差点儿讲的差点儿相同了(至少基本的几个控件都介 ...

  2. centos下配置防火墙port失败

    问题:将规则加入到防火墙中.总是port无法开启 (1)改动文件 首先vim /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp ...

  3. ios 得用代理反向传值

    应用场景:有时时候从界面A跳转到界面B,界面B在返回的时候须要将处理的结果传递给A. 实现思路:1,定义一个负责传值的协义,界面A拥有该协义属性,并实现该协义中的方法 2.界面B也拥有该协义属性(代理 ...

  4. GitHub上排名前100的Android开源库介绍

    GitHub上排名前100的Android开源库介绍 文章来源: http://www.open-open.com/news/view/1587067#6734290-qzone-1-31660-bf ...

  5. md5的用处

    MD5保存摘要及指纹信息 md5的用处: 1.保存用户密码2.校验数据的完整性

  6. Oracle_exp/expdp备份

    目录索引 1.exp和expdp的区别 2.expdp导出数据库流程 一.↓↓exp和expdp的区别↓↓ 1.exp和expdp最明显的区别就是导出速度的不同.expdp导出是并行导出(如果把exp ...

  7. BZOJ 1877 拆点费用流

    思路: 呃  水题不解释 行么,, //By SiriusRen #include <queue> #include <cstdio> #include <cstring ...

  8. X - Vasya and Socks

    Problem description Vasya has n pairs of socks. In the morning of each day Vasya has to put on a pai ...

  9. # secure_link_module模块

    作用 制定并允许检查请求的链接的真实性以及保护资源免遭未经授权的访问 限制链接生效周期 首先检查nginx是否已安装模块 #nginx -V 输出nginx所有已安装模块,检查是否有ngx_http_ ...

  10. Java上传视频

    页面: 上传文件时的关键词:enctype="multipart/form-data" <%@ page language="java" import=& ...