正则表达式快速入门和爬虫

这篇博客介绍了正则表达式的基本概念和使用方法,包括元字符、字符转义、匹配重复、字符集合等,并提供了Python中使用正则表达式的实例。接着,博主展示了如何在爬虫中运用正则表达式提取网页数据,通过爬取猫眼电影TOP100的案例,演示了从页面分析到数据提取的全过程,最后将爬取结果写入JSON文件。
摘要由CSDN通过智能技术生成

正则表达式简介

正则表达式,又称规则表达式。是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

对于爬虫来说,有了它,从HTML里提取想要的信息就非常方便了。

基本语法与使用

正则表达式功能非常强大,但是学好并不是很困难。接下来从一个新手的角度,由浅入深,配合各种示例来讲解正则表达式的用法。

入门小例子

例如我们想要找到一篇英文文献中所有的 we 单词,你可以使用正则表达式:we,这是最简单的正则表达式。但如果仅仅使用 we 来匹配,会发现类似于 well、welcome 这样的单词也会被匹配出来,因为这些单词也包含 we。如何仅仅将 we 单词匹配出来呢?我们需要使用这样的正则表达式:\bwe\b。

“\b” 是正则表达式规定的一个特殊代码,被称为元字符,代表着单词的开头或结尾,也就是单词的分界处,它不代表英文中空格、标点符号、换行等单词分隔符,只是用来匹配一个位置,这种理解方式很关键。

通过上面的例子,我们可以看到元字符在正则表达式中非常关键,元字符的组合能构造出强大的功能。

常用元字符

元字符主要有四种作用:有的用来匹配字符,有的用来匹配字符位置,有的用来匹配数量,有的用来匹配模式。
在这里插入图片描述
上面的元字符是用来匹配字符和位置的,接下来讲解其他功能时,会列出相应的元字符。下面对上面列出的元字符使用一些小例子进行一下练习。

文本:we are still studying and so busy
需求:匹配出所有以s开头的单词
正则表达式:\bs\w*\b
解释:先是某个单词开始处(\b),然后是字母s,然后是任意数量的字母(\w*),最后是单词结束处(\b)
字符转义

如果你想查找元字符本身的话,比如查找 “.” 或者 “*” 就会出现问题,因为它们具有特定含义。这时候就需要转义,使用 “\” 来取消这些字符的特殊含义。例如匹配 www.google.com 这个网址时,表达式可以写为

www\.google\.com
匹配重复

首先列出匹配重复的限定符(指定数量的代码):
在这里插入图片描述
下面是一些匹配重复的例子:

hello\d+:匹配 hello 后面跟一个或者多个数字,例如可以匹配 hello1、hello10 等情况
^\d{5,12}$:匹配五到十二位数字的字符串,例如QQ号符合要求
字符集合

通过上面介绍的这些元字符,可以看到查找数字、字母是很简单的,因为已经有了对应这些字符的集合,但是如果想匹配没有预定义的字符集合,就需要自定义字符集合。在正则表达式中,我们可以通过[ ]来实现自定义字符集合,[abcde]就是匹配abcde中的任意一个字符,[.?!]匹配标点符号(“.”、“?”或“!”)。

除了将需要自定义的字符都写入[ ]中,还可以指定一个字符范围。[0-9]代表的含义与“\d”是完全一致的,代表任意一个数字;[a-z0-9A-Z_]也完全等同于“\w”(只考虑英文),代表着26个字母中的大小写、0~9的数字和下划线中的任意一个字符。

分支条件

正则表达式里的分支条件指的是有几种匹配规则,如果满足其中任意一种规则都应当进行匹配,具体的方法是用 “|” 把不同的规则分开。

例如匹配电话号码,电话号码中一种是 3 位区号,8 位本地号,形如 010-11223344,另一种是 4 位区号,7 位本地号,形如 0321-1234567。这就要用到分支条件:0\d{2}-\d{8}|0\d{3}-\d{7}。在分支条件中有一点需要注意,匹配分支条件时,将会从左往右的测试每个条件,如果满足了某个分支的话,就不会去再管其他条件了,条件之间是一种或的关系。

分组

二次匹配,在匹配到的结果中再次匹配出相应结果。使用小括号指定一个表达式就可以看作一个分组,默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。
在这里插入图片描述

反义

有时需要查找某一类字符集合之外的字符,这时候就需要用到反义:
在这里插入图片描述
例如 “\D+” 匹配非数字的一个或者多个字符。

后向引用

前面我们提到了分组,这个正则表达式 ((\d{1,3}).){3}\d{1,3} 里面有两个分组 1 和 2,这个表达式可以改写为 ((\d{1,3}).){3}\2。

你也可以指定分组的名称,可以通过这样的语法:(?< Digit>\d+)或者(?‘Digit’\d+),这样就把 “\d+” 的组名指定为 Digit 了。要反向引用这个分组的内容,可以使用 \k< Digit>,所以上面的表达式还可以写成 ((?< Digit>\d{1,3}).){3}\k< Digit>。

零宽断言

什么是零宽断言呢?我们知道元字符 “\b”、“^” 匹配的是一个位置,而且这个位置需要满足一定的条件,我们把这个条件称为断言或零宽度断言。断言用来声明一个应该为真的事实,只有当断言为真时才会继续进行匹配。

首先说一下正向零宽断言的两种形式:
(?=exp)叫零宽度正预测先行断言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值