爬虫系列(五) re的基本使用
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的基本使用的更多相关文章
- 爬虫系列(三) urllib的基本使用
一.urllib 简介 urllib 是 Python3 中自带的 HTTP 请求库,无需复杂的安装过程即可正常使用,十分适合爬虫入门 urllib 中包含四个模块,分别是 request:请求处理模 ...
- 爬虫系列(九) xpath的基本使用
一.xpath 简介 究竟什么是 xpath 呢?简单来说,xpath 就是一种在 XML 文档中查找信息的语言 而 XML 文档就是由一系列节点构成的树,例如,下面是一份简单的 XML 文档: &l ...
- 爬虫系列(二) Chrome抓包分析
在这篇文章中,我们将尝试使用直观的网页分析工具(Chrome 开发者工具)对网页进行抓包分析,更加深入的了解网络爬虫的本质与内涵 1.测试环境 浏览器:Chrome 浏览器 浏览器版本:67.0.33 ...
- 爬虫系列(四) 用urllib实现英语翻译
这篇文章我们将以 百度翻译 为例,分析网络请求的过程,然后使用 urllib 编写一个英语翻译的小模块 1.准备工作 首先使用 Chrome 浏览器打开 百度翻译,这里,我们选择 Chrome 浏览器 ...
- 爬虫系列(六) 用urllib和re爬取百度贴吧
这篇文章我们将使用 urllib 和 re 模块爬取百度贴吧,并使用三种文件格式存储数据,下面先贴上最终的效果图 1.网页分析 (1)准备工作 首先我们使用 Chrome 浏览器打开 百度贴吧,在输入 ...
- 爬虫系列(七) requests的基本使用
一.requests 简介 requests 是一个功能强大.简单易用的 HTTP 请求库,可以使用 pip install requests 命令进行安装 下面我们将会介绍 requests 中常用 ...
- 爬虫系列(八) 用requests实现天气查询
这篇文章我们将使用 requests 调用天气查询接口,实现一个天气查询的小模块,下面先贴上最终的效果图 1.接口分析 虽然现在网络上有很多免费的天气查询接口,但是有很多网站都是需要注册登陆的,过程比 ...
- 爬虫系列(十) 用requests和xpath爬取豆瓣电影
这篇文章我们将使用 requests 和 xpath 爬取豆瓣电影 Top250,下面先贴上最终的效果图: 1.网页分析 (1)分析 URL 规律 我们首先使用 Chrome 浏览器打开 豆瓣电影 T ...
- 爬虫系列(十一) 用requests和xpath爬取豆瓣电影评论
这篇文章,我们继续利用 requests 和 xpath 爬取豆瓣电影的短评,下面还是先贴上效果图: 1.网页分析 (1)翻页 我们还是使用 Chrome 浏览器打开豆瓣电影中某一部电影的评论进行分析 ...
随机推荐
- android.os.TransactionTooLargeException
android.os.TransactionTooLargeException 今天开发过程共遇到问题,后台要反回一些表格,不是单纯的数据.就是有一些html标签的东西.错误的思路: 我得到数据后通过 ...
- HDU 5536/ 2015长春区域 J.Chip Factory Trie
Chip Factory Problem Description John is a manager of a CPU chip factory, the factory produces lots ...
- jQuery - 点击图片加边框
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- oc59--匿名分类
// // main.m // 匿名分类(延展) // 可以为某个类扩展私有的成员变量和方法,写在.m文件中, // 分类不可以扩展属性,分类有名字,匿名分类没有名字. #import <Fou ...
- bin/sh^M:损坏的解释器: 没有那个文件或目录
脚本文件保存时使用了DOS格式,用DOS2UNIX转为UNIX格式,也可以用vim打开,用:set ff=unix转换.不要在 Windows下编辑脚本文件,否则经常会遇到这种问题. 代码:sed - ...
- Webstorm配置运行React Native
Webstorm配置运行React Native 1.选择配置 2.选择npm,设置package等参数 3.添加拓展工具 4.配置拓展工具(核心啊) 5.运行测试,ok的.
- servlet中的中文乱码问题
老师总会说道:学完这个知识点,我们来谈谈中文乱码问题. 乱码的问题总是无处不在,处理不好会给用户带极差的用户体验. 那么我们来记录一下servlet中的乱码问题吧! 1.服务器向客户端响应时出现的乱码 ...
- leetcode链表相关
目录 2/445两数相加 综合题(328奇偶链表, 206反转链表, 21合并两个有序链表 ) 92反转链表 II 链表排序(148排序链表, 876链表的中间结点) 142环形链表 II 160相交 ...
- Alignment(dp)
http://poj.org/problem?id=1836 求两遍最长上升子序列,顺序求一遍,逆序求一遍. #include <stdio.h> #include <string. ...
- preg_replace数组的用法
$string = 'The quick brown fox jumped over the lazy dog.';$patterns = array();$patterns[2] = '/quick ...