Python3网络爬虫实战-26、正则表达式

本文介绍了Python3中正则表达式的使用,包括re库的match()、search()、findall()、sub()等方法,以及正则表达式的规则、修饰符、贪婪与非贪婪匹配等概念,旨在帮助读者掌握如何从HTML中提取所需信息。
摘要由CSDN通过智能技术生成

本节我们看一下正则表达式的相关用法,正则表达式是处理字符串的强大的工具,它有自己特定的语法结构,有了它,实现字符串的检索、替换、匹配验证都不在话下。
当然对于爬虫来说,有了它,我们从 HTML 里面提取我们想要的信息就非常方便了。

1. 实例引入

说了这么多,可能我们对它到底是个什么还是比较模糊,下面我们就用几个实例来感受一下正则表达式的用法。
我们打开开源中国提供的正则表达式测试工具:http://tool.oschina.net/regex/,打开之后我们可以输入待匹配的文本,然后选择常用的正则表达式,就可以从我们输入的文本中得出相应的匹配结果了。
例如我们在这里输入待匹配的文本如下:

Hello, my phone number is 010-86432100 and email iscqc@cuiqingcai.com, and my website is http://cuiqingcai.com.

这段字符串中包含了一个电话号码和一个电子邮件,接下来我们就尝试用正则表达式提取出来,如图 3-10 所示:

图 3-10 运行页面
我们在网页中选择匹配 Email 地址,就可以看到在下方出现了文本中的 Email。如果我们选择了匹配网址 URL,就可以看到在下方出现了文本中的 URL。是不是非常神奇?
其实,在这里就是用了正则表达式匹配,也就是用了一定的规则将特定的文本提取出来。比如电子邮件它开头是一段字符串,然后是一个 @ 符号,然后就是某个域名,这是有特定的组成格式的。另外对于 URL,开头是协议类型,然后是冒号加双斜线,然后是域名加路径。
对于 URL 来说,我们就可以用下面的正则表达式匹配:

[a-zA-z]+://[^\s]*
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

如果我们用这个正则表达式去匹配一个字符串,如果这个字符串中包含类似 URL 的文本,那就会被提取出来。
这个正则表达式看上去是乱糟糟的一团,其实不然,这里面都是有特定的语法规则的。比如 a-z 代表匹配任意的小写字母,s 表示匹配任意的空白字符,* 就代表匹配前面的字符任意多个,这一长串的正则表达式就是这么多匹配规则的组合,最后实现特定的匹配功能。
写好正则表达式后,我们就可以拿它去一个长字符串里匹配查找了,不论这个字符串里面有什么,只要符合我们写的规则,统统可以找出来。那么对于网页来说,如果我们想找出网页源代码里有多少 URL,就可以用匹配URL的正则表达式去匹配,就可以得到源码中的 URL 了。
在上面我们说了几个匹配规则,那么正则表达式的规则到底有多少?那么在这里把常用的匹配规则总结一下:

模式 描述
w 匹配字母数字及下划线
W 匹配非字母数字及下划线
s 匹配任意空白字符,等价于 [tnrf].
S 匹配任意非空字符
d 匹配任意数字,等价于 [0-9]
D 匹配任意非数字
A 匹配字符串开始
Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
z 匹配字符串结束
G 匹配最后匹配完成的位置
n 匹配一个换行符
t 匹配一个制表符
^ 匹配字符串的开头
$ 匹配字符串的末尾
. 匹配任意字符,除了换行符,当 re.DOTALL 标记被指定时,则可以匹配包括换行符的任意字符
[…] 用来表示一组字符,单独列出:[amk] 匹配 ‘a’,‘m’ 或 ‘k’
1 不在 [] 中的字符:abc 匹配除了 a,b,c 之外的字符。
* 匹配 0 个或多个的表达式。
+ 匹配 1 个或多个的表达式。
? 匹配 0 个或 1 个由前面的正则表达式定义的片段,非贪婪方式
{n} 精确匹配 n 个前面表达式。
{n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
ab 匹配 a 或 b
( ) 匹配括号内的表达式,也表示一个组

可能看完了之后就有点晕晕的了把,不用担心,下面我们会详细讲解下一些常见的规则的用法。怎么用它来从网页中提取我们想要的信息。

2. 了解 re 库

其实正则表达式不是 Python 独有的,它在其他编程语言中也可以使用,但是 Python 的 re 库提供了整个正则表达式的实现,利用 re 库我们就可以在 Python 中使用正则表达式了,在 Python 中写正则表达式几乎都是用的这个库,下面我们就来了解下它的一些常用方法。

3. match()

在这里首先介绍第一个常用的匹配方法,match() 方法,我们向这个方法传入要匹配的字符串以及正则表达式,就可以来检测这个正则表达式是否匹配该字符串了。

match() 方法会尝试从字符串的起始位置匹配正则表达式,如果匹配,就返回匹配成功的结果,如果不匹配,那就返回 None。

我们用一个实例来感受一下:

import re

content = 'Hello 123 4567 World_This is a Regex Demo'
print(len(content))
result = re.match('^Hello\s\d\d\d\s\d{4}\s\w{10}', content)
print(result)
print(result.group())
print(result.span())

运行结果:

41
<re.Match object; span=(0, 25), match='Hello 123 4567 World_This'>
Hello 123 4567 World_This
(0, 25)

在这里我们首先声明了一个字符串,包含英文字母、空白字符、数字等等内容,接下来我们写了一个正则表达式:


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值