python爬⾍学习2.1(正则表达式re模块)
python爬⾍学习 2.1 (正则表达式re模块)
为什么要学正则表达式
实际上爬⾍⼀共就四个主要步骤:
1.明确⽬标 (要知道你准备在哪个范围或者⽹站去搜索)
2.爬 (将所有的⽹站的内容全部爬下来)
3.取 (去掉对我们没⽤处的数据)
4.处理数据(按照我们想要的⽅式存储和使⽤)
我们在以往的案例⾥实际上省略了第3步,也就是"取"的步骤。因为我们down下了的数据是全部的⽹页,这些数据很庞⼤并且很混乱,⼤部分的东西使我们不关⼼的,因此我们需要将之按我们的需要过滤和匹配出来。
那么对于⽂本的过滤或者规则的匹配,最强⼤的就是正则表达式,是Python爬⾍世界⾥必不可少的神兵
利器。
什么是正则表达式
正则表达式,⼜称规则表达式,通常被⽤来检索、替换那些符合某个模式(规则)的⽂本。
正则表达式是对字符串操作的⼀种逻辑公式,就是⽤事先定义好的⼀些特定字符、及这些特定字符的组合,组成⼀个"规则字符串",这个"规则字符串"⽤来表达对字符串的⼀种过滤逻辑。
给定⼀个正则表达式和另⼀个字符串,我们可以达到如下的⽬的:
给定的字符串是否符合正则表达式的过滤逻辑(“匹配”);
通过正则表达式,从⽂本字符串中获取我们想要的特定部分(“过滤”)。
正则表达式匹配规则
Python 的 re 模块
在 Python 中,我们可以使⽤内置的 re 模块来使⽤正则表达式。
有⼀点需要特别注意的是,正则表达式使⽤ 对特殊字符进⾏转义,所以如果我们要使⽤原始字符串,只需加⼀个 r 前缀,⽰例:
r'chuanzhiboke\t\.\tpython'
re 模块的⼀般使⽤步骤如下:
使⽤ compile() 函数将正则表达式的字符串形式编译为⼀个 Pattern 对象
通过 Pattern 对象提供的⼀系列⽅法对⽂本进⾏匹配查,获得匹配结果,⼀个 Match 对象。
最后使⽤ Match 对象提供的属性和⽅法获得信息,根据需要进⾏其他的操作
compile 函数
compile 函数⽤于编译正则表达式,⽣成⼀个 Pattern 对象,它的⼀般使⽤形式如下:
import re
# 将正则表达式编译成 Pattern 对象
pattern = repile(r'\d+')
在上⾯,我们已将⼀个正则表达式编译成 Pattern 对象,接下来,我们就可以利⽤ pattern 的⼀系列⽅法对⽂本进⾏匹配查了。
Pattern 对象的⼀些常⽤⽅法主要有:
match ⽅法:从起始位置开始查,⼀次匹配
search ⽅法:从任何位置开始查,⼀次匹配
findall ⽅法:全部匹配,返回列表
finditer ⽅法:全部匹配,返回迭代器
split ⽅法:分割字符串,返回列表
sub ⽅法:替换
match ⽅法
match ⽅法⽤于查字符串的头部(也可以指定起始位置),它是⼀次匹配,只要到了⼀个匹配的结果就返回,⽽不是查所有匹配的结果。它的⼀般使⽤形式如下:
match(string[, pos[, endpos]])
其中,string 是待匹配的字符串,pos 和 endpos 是可选参数,指定字符串的起始和终点位置,默认值分别是 0 和 len (字符串长度)。因此,当你不指定 pos 和 endpos 时,match ⽅法默认匹配字符串的头部。
当匹配成功时,返回⼀个 Match 对象,如果没有匹配上,则返回 None。
>>>import re
>>> pattern = repile(r'\d+')# ⽤于匹配⾄少⼀个数字
>>> m = pattern.match('one12twothree34four')# 查头部,没有匹配
>>>print(m)
None
>>> m = pattern.match('one12twothree34four',2,10)# 从'e'的位置开始匹配,没有匹配
>>>print(m)
None
>>> m = pattern.match('one12twothree34four',3,10)# 从'1'的位置开始匹配,正好匹配
>>>print(m)# 返回⼀个 Match 对象
<_sre.SRE_Match object at 0x10a42aac0>
>>> m.group(0)# 可省略 0
'12'
>>> m.start(0)# 可省略 0
3
>>> m.end(0)# 可省略 0
5
>>> m.span(0)# 可省略 0
(3,5)
在上⾯,当匹配成功时返回⼀个 Match 对象,其中:
group([group1, …]) ⽅法⽤于获得⼀个或多个分组匹配的字符串,当要获得整个匹配的⼦串时,可直接使⽤ group() 或 group(0);
start([group]) ⽅法⽤于获取分组匹配的⼦串在整个字符串中的起始位置(⼦串第⼀个字符的索引),参数默认值为 0;
end([group]) ⽅法⽤于获取分组匹配的⼦串在整个字符串中的结束位置(⼦串最后⼀个字符的索引+1),参数默认值为 0;
span([group]) ⽅法返回 (start(group), end(group))。
再看看⼀个例⼦:
>>>import re
>>> pattern = repile(r'([a-z]+) ([a-z]+)', re.I)# re.I 表⽰忽略⼤⼩写
>>> m = pattern.match('Hello World Wide Web')
>>>print(m)# 匹配成功,返回⼀个 Match 对象
<_sre.SRE_Match object at 0x10bea83e8>
>>> m.group(0)# 返回匹配成功的整个⼦串
'Hello World'
>>> m.span(0)# 返回匹配成功的整个⼦串的索引
(0,11)
>>> m.group(1)# 返回第⼀个分组匹配成功的⼦串
'Hello'
>>> m.span(1)# 返回第⼀个分组匹配成功的⼦串的索引
(0,5)
>>> m.group(2)# 返回第⼆个分组匹配成功的⼦串
'World'
>>> m.span(2)# 返回第⼆个分组匹配成功的⼦串
(6,11)
>>> m.groups()# 等价于 (m.group(1), m.group(2), ...)
('Hello','World')
>>> m.group(3)# 不存在第三个分组
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
IndexError: no such group
search ⽅法正则表达式提取中文
search ⽅法⽤于查字符串的任何位置,它也是⼀次匹配,只要到了⼀个匹配的结果就返回,⽽不是查所有匹配的结果,它的⼀般使⽤形式如下:
search(string[, pos[, endpos]])
其中,string 是待匹配的字符串,pos 和 endpos 是可选参数,指定字符串的起始和终点位置,默认值分别是 0 和 len (字符串长度)。
当匹配成功时,返回⼀个 Match 对象,如果没有匹配上,则返回 None。
让我们看看例⼦:
>>>import re
>>> pattern = repile('\d+')
>>> m = pattern.search('one12twothree34four')# 这⾥如果使⽤ match ⽅法则不匹配
>>> m
<_sre.SRE_Match object at 0x10cc03ac0>
>>> m.group()
'12'
>>> m = pattern.search('one12twothree34four',10,30)# 指定字符串区间
>>> m
<_sre.SRE_Match object at 0x10cc03b28>
>>> m.group()
'34'
>>> m.span()
(13,15)
再来看⼀个例⼦:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论