爬虫必会知识点--->正则表达式

一、为什么要学正则表达式

实际上爬虫一共就四个主要步骤:

​ (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>']
#.*?---
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值