正则表达式
一、为什么要学正则表达式
实际上爬虫一共就四个主要步骤:
(1)明确目标(要知道你准备在哪个范围或者网站去搜索)
(2)爬(将所有的网站的内容全部爬下来)
(3)取(去掉对我们没用处的数据)
(4)处理数据(按照我们想要的方式存储和使用)
我们在之前的案例里实际上省略了第 3 步,也就是"取"的步骤。因为我们 down 下了的
数据是全部的网页,这些数据很庞大并且很混乱,大部分的东西是我们不关心的,因此我们
需要将之按我们的需要过滤和匹配出来。
那么对于文本的过滤或者规则的匹配,最强大的就是正则表达式,是 Python 爬虫世界
里必不可少的神兵利器。
二、正则表达式的原理
三、元字符
1、匹配边界
^ | 行首 |
---|---|
$ | 行尾 |
2、匹配字符
\d | 数字 |
---|---|
\w | 数字,字符,下划线 |
\b | 单词的边界 |
\s | 空白字符 |
. | 除换行符以外的任意字符 |
[a-z1-9A-Z] | 字母和数字 |
[\u4e00-\u9fa5] | 中文 |
[^123abc] | 匹配除了123abc这几个字符以外的任意字符 |
3、重复次数
? | 0或1 |
---|---|
* | >=0 |
+ | >=1 |
{n,} | >=n |
{n,m} | n<=x<=m |
{n} | 重复n次 |
四、python中正则表达式模块-------re
一、re的使用步骤
第一步: 使用compile()函数将正则表达式的字符串形式编译为一个Pattern对象
第二步:通过Pattern对象提供的一系列方法对文本进行匹配查找,获取匹配结果,一个Match对象
第三步:最后使用Match对象提供的属性和方法获取信息,根据需要进行其他的操作
import re
1、将正则表达式编译成一个pattern对象
pattern = re.compile(
r'正则表达',
'匹配模式')
re.S----.可以匹配换行符—.现在啥都能匹配了。
re.I—忽略大小写
2、pattern对象有以下几个方法:
(1)match:从头开始匹配,只匹配一次,返回match对象
Match = pattern.match(
string,#要匹配的目标字符串
pos,#要匹配目标字符串的起始位置(可选)
endpos#结束位置(可选)
)
#match对象属性
#1、取内容
print(m3.group(0))
#2、取匹配范围
print(m3.span(0))
# 3、取起始位置
print(m3.start(0),m3.end())
(2)search:从任意位置匹配,只匹配一次,返回match的对象
Match = pattern.search(
string,#要匹配的目标字符串
pos,#要匹配目标字符串的起始位置(可选)
endpos#结束位置(可选)
)
(3)findall:全文匹配,匹配多次,返回list。
list= pattern.findall(
string,#要匹配的目标字符串
pos,#要匹配目标字符串的起始位置(可选)
endpos,#结束位置(可选)
)
(4)finditer:全文匹配,匹配多次,返回可迭代对象
补充:
可迭代对象和迭代器。
可迭代对象:——iter——
迭代器:——next——,——iter——
对于可迭代对象,我们都是通过for循环来进行遍历获取数据的。
二、贪婪模式与非贪婪模式
1、贪婪和非贪婪是对数量控制符的限时,作用对象就是数量控制符。
2、贪婪表示数量控制符取最大值,非贪婪表示数量控制符取最小值。
3、正则模式数量控制符取最大值也是默认贪婪模式。非贪婪需要通过?来控制。
\d+?
4、非贪婪主要用于精确查找。
import re
# p1 = re.compile(r'ab*')#[0,3]
p1 = re.compile(r'ab*?')#[0,3]
r1 = p1.findall('abbbc')
# print(r1)
#在非贪婪的情况下,就取最小值:0
p3 = re.compile(r'ab+?')#[1,3]
r3 = p3.findall('abbbc')
print(r3)
# p4 = re.compile(r'ab?')
p5 = re.compile(r'ab??')#[0,1]
r5 = p5.findall('abbbc')
print(r5)
import re
s = 'aa<div>test1</div>bb<div>test2</div>cc'
pattern1 = re.compile('<div>.*</div>')#[5,24]
pattern2 = re.compile('<div>.*?</div>')#[5,24]
result1 = pattern1.findall(s)
result2 = pattern2.findall(s)
print(result1) #['<div>test1</div>bb<div>test2</div>']
print(result2) #['<div>test1</div>']
#.*?---