点击上方“AI派”,选择“设为星标”
最新分享,第一时间送达!
作者:Tango,目前就职在一家对日开发的的IT服务公司。不是科班出身的我,出于对编程的热爱,自学了软件开发。从此深深陷入在代码的世界而无法自拔。
编辑:王老湿
我们的《从零开始学爬虫》专栏发布后,目前已经更新了三篇:
今天我们来介绍一个在爬虫中非常重要的工具:正则表达式。正则表达式是一个特殊的符号系列,它能够帮助开发人员检查一个字符串是否与某种模式匹配。
本篇文章涉及以下内容:
正则表达:学会正则表达式的常用符号。
Python的re模块的使用
介绍re在爬虫中的运用
正则表达基础
1. 行定位符
行定位符就是用来描述子串的边界。^ 表示行的开始,$ 表示行的结尾。
例如:
^py
这个表达式表示匹配子串py的开始位置是行头, 如:"python"就是可以匹配到的,而"Java and py"则不匹配。
但是如果使用:
py$
则是可以匹配的。
如果要匹配子串可以出现在字符串的任意部分,那么可以直接写成:
py
2. 元字符
我们常用的主要有以下几种,大家先了解一下,后面的爬虫中会慢慢讲解。
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母,数字,下划线或汉字 |
\W | 匹配除字母,数字,下划线或汉字以外的内容 |
\s | 匹配单个的空白符(包括<TAB>键和换行符) |
\S | 匹配除单个的空白符(包括<TAB>键和换行符)以外的所有字符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束,单词的分界符通常是空格,标点符号或者换行 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾 |
比如下面的这个表达式:
\bgo\w*\b
它用于匹配以字母go开头的单词。
类似:goto, google, gogo123这样的都可以被匹配到。但是像:bo,to这样的单词是匹配不到的。因为不是go开头的。
3. 限定符
常用的限定符:
限定符 | 说明 | 举例 |
---|---|---|
? | 匹配前面的字符零次或一次 | colou?r,该表达式可以匹配color和colour |
+ | 匹配前面的字符一次或多次 | go+gle,该表达式可以匹配的范围从gogle到goo…gle |
* | 匹配前面的字符零次或者多次 | go*gle,该表达式匹配的范围从ggle到goo…gle |
{n} | 匹配前面的字符n次 | go{2}gle,该表达式只匹配google |
{n,} | 匹配前面的字符最少n次 | go{2,}gle,该表达式匹配范围从google到goo…gle |
{n,m} | 匹配前面的字符最少n次,最多m次 | employe{0, 2},该表达式匹配employ,employe和employee3种情况 |
4. 选择字符
我们通常使用 | 来实现选择,比如我们的身份证号有15位和18位的,那怎么匹配呢?
(^\d{15}$)|(^\d{18}$)|(^\d{17})(\d|X|x)$
这个的意思式要么是15个数字,要么是18个数字或者17个数字加一个x(大写,小写)
这里的括号表示分组。
Python Re模块
我们可以通过下面的代码导入re库
import re
1. 使用match()方法进行匹配
match()方法用于从字符串的开始处进行匹配,如果在起始位置匹配成功,则返回Match对象,否则返回None,语法如下
re.match(pattern, string, [flags])
pattern:表示模式字符串,由要匹配的正则表达式转换而来
string:表示要匹配的字符串
flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
比如匹配字符串是否以"py"开头,不区分大小写代码如下
import re
pattern = r'py\w+'
string = 'python is PYTHON'
match = re.match(pattern, string, re.I) # re.I表示不区分大小写
print(match)
string = "这是python"
match = re.match(pattern, string, re.I)
print(match)
因为match是用字符串的开头开始匹配的,因为"这是python"这个字符串不是py开始的。所以返回的是None。span这个元组表示匹配的位置,第一个为开始位置,第二个为结束位置。
import re
pattern = r'py\w+'
string = 'python is PYTHON'
match = re.match(pattern, string, re.I) # re.I表示不区分大小写
print(match)
print("匹配的起始位置:", match.start())
print("匹配的结束位置:", match.end())
print("匹配的元组:", match.span())
print("匹配的字符:", match.string)
print("匹配的数据:", match.group())
2. 使用search()方法进行匹配
search()方法用于在整个字符串中搜索第一个匹配的值,找到就返回Match对象,否则返回None,语法如下:
re.search(pattern, string, [flags])
import re
pattern = r'py\w+'
string = 'python is PYTHON'
match = re.search(pattern, string, re.I) # re.I表示不区分大小写
print(match)
string = "这是python"
match = re.search(pattern, string, re.I)
print(match)
从运行结果可以看出,这个方法不仅仅在字符串的起始位置搜索,其他位置有符合的匹配也可以。
3. 使用findall()方法进行匹配
findall()方法用于在整个字符串中搜索所有符合正则表达式的字符串,并以列表的形式返回。查找不到就返回空列表。
re.findall(pattern, string, [flags])
import re
pattern = r'py\w+'
string = 'python is PYTHON'
match = re.findall(pattern, string, re.I) # re.I表示不区分大小写
print(match)
string = "这是python"
match = re.findall(pattern, string, re.I)
print(match)
4. 替换字符串
sub方法用于实现字符串替换。在爬虫中很少会用到。等遇到后和大家分享。
5. 用split()方法分割字符串
import re
pattern = r'[?|&]'
url = 'https://search.bilibili.com/live?keyword=IT蜗壳'
result = re.split(pattern, url)
print(result)
这里用?将url分割了两部分
好了,今天的分享就是这些了,我们下期见。
另外,我们成立了这个爬虫专栏的读者交流群,如果有问题欢迎大家在群里积极讨论。还没有加入的同学可以扫描下方的微信二维码,添加微信好友,之后统一邀请你加入交流群。添加好友时一定要备注:爬虫。
/ 每日赠书专区 /
为了回馈一直以来支持我们的读者,“每日赠书专区”会每天从留言支持我们的读者中选择一名最脸熟的读者来赠予实体书籍(包邮),当前通过这种方式我们已赠送出 20+ 本书籍。
脸熟的评判标准是根据通过留言的次数来决定的
留言时需要按照今日留言主题来用心留言,否则不计入总数
每日赠书专区会出现在AI派当天发布文章的头条或次条的文章末尾
如果不理解头条/次条的含义的读者可看下面的图。
今天我们的每日赠书专区出现在“次条”的位置上,书籍为《从零开始学Python网络爬虫》。
本书简介:
Python是数据分析的首要语言,而网络中的数据和信息很多,如何从中获取需要的数据和信息呢?最简单、直接的方法就是用爬虫技术来解决。
本书是一本教初学者学习如何爬取网络数据和信息的入门读物。书中不仅有Python的相关内容,而且还有数据处理和数据挖掘等方面的内容。本书内容非常实用,讲解时穿插了22个爬虫实战案例,可以大大提高读者的实际动手能力。
?↑↑点击上方可购买
恭喜上期通过留言成功混脸熟的读者:15,赠送一本《利用Python进行数据分析》
请该同学联系小编:wanglaoshi201907
点下「在看」,给文章盖个戳吧!