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. C++开发人脸性别识别总结

    历时一个月,最终在昨天把<C++开发人脸性别识别总结>系列博客完毕了,第一篇博客发表在2015年12月29日,截止昨天2016年2月29日最后一篇完毕,去除中间一个月的寒假,正好一个月,首 ...

  2. spark之map与flatMap差别

    scala> val m = List(List("a","b"),List("c","d")) m: List[ ...

  3. 我的Android进阶之旅------&gt;android中getLocationInWindow 和 getLocationOnScreen的差别

    View.getLocationInWindow(int[] location) 一个控件在其父窗体中的坐标位置 View.getLocationOnScreen(int[] location) 一个 ...

  4. oc59--匿名分类

    // // main.m // 匿名分类(延展) // 可以为某个类扩展私有的成员变量和方法,写在.m文件中, // 分类不可以扩展属性,分类有名字,匿名分类没有名字. #import <Fou ...

  5. ubuntu下7z文件的解压方法

    apt-get install p7zip-full 控制台会打出以下信息: 正在读取软件包列表... 完成正在分析软件包的依赖关系树       正在读取状态信息... 完成       建议安装的 ...

  6. canvas制作饼图和环形图,使用Excanvas兼容IE67

    excanvas 地址:http://excanvas.sourceforge.net/ <!DOCTYPE html> <html> <head> <met ...

  7. mongodb 对内存的占用监控 ——mongostat,linux系统可用的内存是free + buffers + cached

    刚开始使用mongodb的时候,不太注意mongodb的内存使用,但通过查资料发现mongodb对内存的占用是巨大的,在本地测试服务器中,8G的内存居然被占用了45%.汗呀. 本文就来剖析一下mong ...

  8. insufficient space

  9. 日期数据类型为Date ,前台传递喂String的后台处理

    方法一: 在实体类里面将set方法里面将数据类型转为Date public void setBirth(String birth) { SimpleDateFormat sdf = new Simpl ...

  10. 爬虫框架Scrapy与Web框架Django结合

    在做两者结合之前,需要先准备一个可以独立运行的Scrapy框架和一个可以独立运行的Django框架! 当准备好这两个框架之后,就可以做两者的结合了. 一. 把scrapy框架,移动到Django框架的 ...