【Python爬虫学习笔记(2)】正则表达式(re模块)相关知识点总结
1. 正则表达式
正则表达式是可以匹配文本片段的模式。
1.1 通配符
正则表达式能够匹配对于一个的字符串,可以使用特殊字符创建这类模式。(图片来自cnblogs)
1.2 特殊字符的转义
由于在正则表达式中,有时需要将特殊字符作为普通字符处理,就需要用‘\’进行转义,例如‘python\\.org’就会匹配‘python.org’,那么为什么要用两个反斜杠呢,原因在于需要进行两层转义,首先是re模块表示正则表达式中需要转义一次,其次是python解释器即python的语法还要求再转义一次。也是因为这个原因,对于‘\’需要‘\\\\’来匹配。为了表示的简介性,可以使用原始字符串来处理,则上面两例分别可以写为r‘python\.org’和r‘\\’。
1.3 字符集
举例说明,例如‘[pj]python’可以匹配‘python’和‘jpython’,[a-zA-Z0-9]可以匹配任意一个大小写字母和数字(注意:是一个)。为了反转字符集,可以将‘^’放在字符串的开头,例如‘[^abc]’可以匹配除a,b,c以为的任意字符。
注意:如果希望‘.’,‘*’,‘?’这些特殊字符用作文本字符,则需‘\’进行转义,但是在字符集中无必要,尽管是合法的(因为可以调整顺序来解决)。记住以下两个规则:
a. 如果‘^’出现在字符集的开头则需要转义,除非希望用作字符集反转。
b. 右中括号‘]’和横线‘-’要么放在字符集开头,要么转义。
1.4 选择符和子模块
如果只想匹配‘python’和‘perl’,则可以用选择运算符管道符号‘|’,模式可写为‘python|perl’
如果不需要对整个模式使用选择运算符,而只需要一部分,可以用括号括起需要的部分,对于上例,表示为‘p(ython|erl)’。括号括起部分称为子模块(subpattren)。
1.5 可选项和重复子模块
在子模块后面加上问号,就变成了可选项。
(pattern)?:允许模式出现0次或者1次。
(pattern)+:允许模式出现1次或者多次。
(pattern)*:允许模式出现0次或者多次。
(pattern){m,n}:允许模式出现m~n次。
1.6 字符串的开始和结尾
举例说明,‘www.python.org’和‘python.www.org’中的子字符串‘www’能匹配模式‘w+’,但是只希望‘www.python.org’能匹配,则模式可用‘^w+’表示,如果希望‘python.org.www’中的子字符串‘www’能匹配‘w+’,则模式需写为‘$w+’。
2. re模块的函数
2.1 .compile
将正则表达式转换为模式对象,实现更有效率的匹配。
- import re
- pattern = re.compile('(^w+)\.python\.org')
2.2 .search(重要)
在给定字符串中寻找第一个匹配给定正则表达式的子字符串,如果找到会返回一个MatchObject对象,这个对象中的元素可以.group()得到(之后将会介绍group的概念),如果没找到就会返回None。
可以先判断是否找到再取元素,假设例子中的pattern有两个组,返回第一个组。
- have_character = re.search(pattern,text)
- if not have_character:
- return have_character.group(1)
2.3 .match
在给定字符串的开始处匹配正则表达式,例如re.match(‘p’,‘python’)返回为对象MatchObject,即匹配成功,如果要匹配整个字符串,则可以在模式最后加上‘$’符号(代表结尾也匹配)。
2.4 .split
根据模式匹配项来分割字符串。类似于字符串的split方法,但是可用正则表达式来带起固定的分隔符字符串,例如允许用任意长度的逗号和空格序列来分割字符串。
- text = 'a, b,,,,c d'
- re.split('[, ]+', text)
- #['a', 'b', 'c', 'd']
参数maxsplit可以设定最多的分割次数。
- text = 'a, b,,,,c d'
- re.split('[, ]+', text, maxsplit=2)
- #['a', 'b', 'c d']
2.5 .findall(重要)
该方法以列表的形式返回所有的匹配项。
- pattern = 'a(b+?)c(d+?)e'
- items = re.findall(pattern, 'abbcddeabbbcddde')
- print items
- #items = [('bb', ‘dd’), ('bbb', 'ddd')]
2.6 .sub(pattern, repl, string[, count=0]) (重要)
将字符串中所有pattern的匹配项用repl代替。
- pattern = re.compile(r'\*([^\*]+)\*')
- re.sub(pattern, r'<em>\1</em>', 'Hello, *world*!')
- #'Hello, <em>world</em>!'
在sub函数三个参数中,pattern代表模式,repl代表目标形式,string代表待匹配替换字符串。
替换步骤:
a. 用模式pattern套待匹配替换字符串string。
b. 按照目标形式repl对字符串进行重建(即用目标形式去代替string中与pattern匹配的子字符串)
sub函数强大功能最重要的体现在于可以在替代字符串中使用组号。(具体内容参考链接:http://stackoverflow.com/questions/5984633/python-re-sub-group-number-after-number, http://www.crifan.com/python_re_sub_detailed_introduction/)
- re.sub(r'(foo)', r'\g<1>123', 'foobar')
- #'foo123bar'
2.7 .escape
如果一个字符串很长且包含很多特殊字符,而不想输入一大堆反斜杠来转义,可以用这个函数对字符串中所有可能被解释为正则运算符的字符进行转义为普通文本字符。
3. 匹配对象和组
re模块的search,match函数在找到匹配项时都会返回一个MatchObject对象,对于这样一个对象m,可以用m.group()来取某组的信息,如果.group()默认组号为0,则返回整个字符串,.group(1)返回与第一个子模式匹配的单个字符串,.group(2)等等以此类推。
.start()方法得到对应组的开始索引,.end()得到对应组的结束索引,.span()以元组形式给出对应组的开始和结束位置,括号中填入组号,不填入组号时默认为0。
4. 贪婪和非贪婪模式
重复运算符在默认条件下是贪婪的。
- pattern = r'\*(.+)\*'
- re.sub(pattern, r'<em>\1</em>', '*This* is *it*!')
- #'<em>This* is *it</em>'
可见贪婪模式匹配了开始星号到结束星号间的全部内容,包括中间两个星号。
用(.+?)代替(.+)得到非贪婪模式,它会匹配尽可能少的内容。
- pattern = r'\*(.+?)\*'
- re.sub(pattern, r'<em>\1</em>', '*This* is *it*!')
- #'<em>This</em> is <em>it</em>'
参考资料:
《Beginning Python From Novice to Professional》
https://docs.python.org/2.7/library/re.html
转载请注明:
http://www.cnblogs.com/wuwenyan/p/4771422.html
【Python爬虫学习笔记(2)】正则表达式(re模块)相关知识点总结的更多相关文章
- python爬虫学习笔记(一)——环境配置(windows系统)
在进行python爬虫学习前,需要进行如下准备工作: python3+pip官方配置 1.Anaconda(推荐,包括python和相关库) [推荐地址:清华镜像] https://mirrors ...
- Python爬虫学习笔记(三)
Cookies: 以抓取https://www.yaozh.com/为例 Test1(不使用cookies): 代码: import urllib.request # 1.添加URL url = &q ...
- 【Python】学习笔记十二:模块
模块(module) 在Python中,一个.py文件就是一个模块.通过模块,你可以调用其它文件中的程序 引入模块 先写一个first.py文件,内容如下: def letter(): print(' ...
- (转)Python爬虫学习笔记(2):Python正则表达式指南
以下内容转自CNBLOG:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html 1. 正则表达式基础 1.1. 简单介绍 正则表达式并 ...
- python爬虫学习笔记
爬虫的分类 1.通用爬虫:通用爬虫是搜索引擎(Baidu.Google.Yahoo等)“抓取系统”的重要组成部分.主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份. 简单来讲就是尽可 ...
- 一入爬虫深似海,从此游戏是路人!总结我的python爬虫学习笔记!
前言 还记得是大学2年级的时候,偶然之间看到了学长在学习python:我就坐在旁边看他敲着代码,感觉很好奇.感觉很酷,从那之后,我就想和学长一样的厉害,就想让学长教我,请他吃了一周的饭,他答应了.从此 ...
- Python、pip和scrapy的安装——Python爬虫学习笔记1
Python作为爬虫语言非常受欢迎,近期项目需要,很是学习了一番Python,在此记录学习过程:首先因为是初学,而且当时要求很快速的出demo,所以首先想到的是框架,一番查找选用了Python界大名鼎 ...
- Python爬虫学习笔记-1.Urllib库
urllib 是python内置的基本库,提供了一系列用于操作URL的功能,我们可以通过它来做一个简单的爬虫. 0X01 基本使用 简单的爬取一个页面: import urllib2 request ...
- 【Python爬虫学习笔记(3)】Beautiful Soup库相关知识点总结
1. Beautiful Soup简介 Beautiful Soup是将数据从HTML和XML文件中解析出来的一个python库,它能够提供一种符合习惯的方法去遍历搜索和修改解析树,这将大大减 ...
随机推荐
- Nodejs V8引擎 fast property lookup
前言 之所以会研究这个东西,是我在网上找了一下各个语言的执行效率比较.好吧,我承认这是个无聊的东西,不过看看总是无妨,然而我惊讶的发现,有些测试声称Java,C,Nodejs是处在同一个效率级别参见链 ...
- Python学习札记(五) Basic2 字符串和编码
参考:字符串和编码 Note A.字符编码 1.计算机处理文本 == 将文本转换为二进制 => 处理 2.8 bit(比特) = 1 byte(字节) 一个字节所能表示的最大的十进制整数是255 ...
- /nagios/cgi-bin/cmd.cgi无法打开
原因分析,nginx不支持post. 解决方法,重新编译nagios 1.vi /nagios-4.0.8/cgi/cmd.c 找到printf("<form method='post ...
- UVa 11149 矩阵的幂(矩阵倍增法模板题)
https://vjudge.net/problem/UVA-11149 题意: 输入一个n×n矩阵A,计算A+A^2+A^3+...A^k的值. 思路: 矩阵倍增法. 处理方法如下,一直化简下去直到 ...
- VS2017 MVC项目,新建控制器提示未能加载文件或程序集“Dapper.Contrib解决方法
VS2017中MVC项目中,右键新建控制器时,提示 未能加载文件或程序集“Dapper.Contrib, Version=1.50.0.0, Culture=neutral, PublicKeyTok ...
- SpringBoot自动配置的实现原理
之前一直在用SpringBoot框架,一直感觉SpringBoot框架自动配置的功能很强大,但是并没有明白它是怎么实现自动配置的,现在有空研究了一下,大概明白了SpringBoot框架是怎么实现自动配 ...
- AsyncCallback 异步回调委托
js是单线程语言,单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务.如果前一个任务耗时很长,后一个任务就不得不一直等着. 如果排队是因为计算量大,CPU忙不过来,倒也算了,但是很多 ...
- Ubuntu 下Python 环境问题
问题描述: 原先使用Anaconda环境,若卸载后仍不能恢复到系统默认的Python环境. 解决方案: shell 寻找缓存路径,python的扩展/home/tom/anaconda/bin/pyt ...
- element UI 中DateTimePicker 回传时间选择
之前在项目中用vue和element,日期和时间选择用的element2.0 的DateTimePicker 日期选择后提交没问题,在编辑页面通过后端返回时间字符串(敲黑板,这里是重点)绑定也没洒问题 ...
- 虚拟机VirtualBox及轻量级的CentOS
1,先下载虚拟机VirtualBox和centos(下边有链接),将VirtualBox安装在本机 2,管理 --> 导入虚拟电脑 --> 选择本地centos文件 3,点击下一步 - ...