如果说网络爬虫爬取的网页信息是数据大海,正则表达式就是我们进行“大海捞针”的工具。
1.正则表达式的重要符号
符号 | 描述 |
---|---|
\w | 匹配字母、数字、下划线 |
\W | 匹配不是字母、数字、下划线的字符 |
\s | 匹配空白字符 |
\S | 匹配不是空白字符 |
\d | 匹配数字 |
\D | 匹配非数字的字符 |
. | 匹配任意一个字符(包括汉字),换行\n除外 |
* | 重复0或N次 |
+ | 重复1或N次 |
? | 重复0或1次 |
[m] | 匹配单个字符串 |
[m1m2…n] | 匹配多个字符串 |
[m-n] | 匹配m到n区间内的数字、字母 |
[^m] | 匹配除m以外的字符串 |
() | 对正则表达式进行分组,一对圆括号表示一组 |
{m} | 重复m次 |
{m,n} | 该限定符的意思是至少有m个重复,至多有n个重复 |
2.网络爬虫中用的最多的正则表达式
- .:匹配任意一个字符,换行\n除外
- *:匹配前一个字符0次或无限次
- ?:匹配前一个字符0次或者一次
- .*?:贪心算法
- .*?:非贪心算法
- () 内的数据作为结果输出
3.具体用法
python中使用正则表达式需要引入re模块
如:
import re #第一步,要引入re模块
a = re.findall(“匹配规则”,“要匹配的字符串”) #第二步,调用模块函数
以列表形式返回匹配到的字符串
如:`
import re #第一步,引入re模块
a=re.findall("网络爬虫","学习网络爬虫需要用到正则表达式") #第二步,调用模块函数
print(a) #以列表形式返回匹配到的字符串
#打印出 ['网络爬虫']
(1) .元字符
匹配 . 符号后面的任意一个字符
a = re.findall(“x.”,“y”)
x分以下2种情况:
①x为y中任意一个字符,这个字符处于y的中间位置(若这个字符在y中只有一个并且处于y中最后一个字符,打印出来的即为[ ]),则将x和x后面紧跟的一个字符打印出来
import re
a=re.findall("习.","学习网络爬虫,需要学习正则表达式")
print(a)
#打印出['习网', '习正']
②x为y中多个紧连在一起的字符组成的字符串,则将x和x后面紧跟的一个字符打印出来
import re
a=re.findall("学习.","学习网络爬虫,需要学习正则表达式")
print(a)
#打印出['学习网', '学习正']
(2) *元字符
匹配 * 前一个字符0次或无限次
a = re.findall(“x.”,“y”)
注:(*元字符前面的一个字符可以是0或者多个y中原本的字符)区别于
(+元字符前面的一个字符可以是1或者多个y中原本的字符)
x分以下2种情况:
①x为y中任意一个字符,则将x按照在y中所在位置以元组的形式打印出来,其他位置全为空,但会多出一个空字符 ‘ ’
import re
a=re.findall("学*","学习我需要学习网络爬虫")
print(a)
#打印出['学', '', '', '', '', '学', '', '', '', '', '', '']
②x为y中多个紧连在一起的字符组成的字符串,
(A)*元符号前的字符是y中原本的字符,则将x打印出来,有几个x就打印几个
import re
a=re.findall("网络爬虫*","需要学习网络爬虫,我喜欢学习网络爬虫")
print(a)
#打印出['网络爬虫', '网络爬虫']
(B)*元符号前紧连的一个字符是y中不存在,则会将除去这个字符前的其他字符打印出来,有几个就打印几个[体现了 * 元字符前面的一个字符可以是0个y中原本的字符]
import re
a=re.findall("网络爬虫啊*","需要学习网络爬虫,我喜欢学习网络爬虫")
print(a)
#打印出['网络爬虫', '网络爬虫']
注:+元符号前紧连的一个字符是y中不存在,则打印出[ ] ``
import re
a=re.findall(“网络爬虫啊+”,“需要学习网络爬虫,我喜欢学习网络爬虫”) print(a)
#打印出[ ]
(3)*元符号前紧连的多个字符是y中不存在,则打印出[ ]
import re
a=re.findall("网络爬虫啊啊*","需要学习网络爬虫,我喜欢学习网络爬虫")
print(a)
#打印出[]
(3) ?元字符
匹配前一个字符0次或者1次
a = re.findall(“x.”,“y”)
需要与字符串里完全符合,?元字符前的一个字符可以是0个或者1个y中原本字符,匹配一个字符0次或1次
x分以下2种情况:
①x为y中任意一个字符,则将x按照在y中所在位置以元组的形式打印出来,其他位置全为空,但会多出一个空字符 ‘ ’
import re
a=re.findall("学?","学习我需要学习网络爬虫")
print(a)
#打印出['学', '', '', '', '', '学', '', '', '', '', '', '']
②x为y中多个紧连在一起的字符组成的字符串,
(A)?元符号前的字符是y中原本的字符,则将x打印出来,有几个x就打印几个
import re
a=re.findall("网络爬虫?","需要学习网络爬虫,我喜欢学习网络爬虫")
print(a)
#打印出['网络爬虫', '网络爬虫']
(B)?元符号前紧连的一个字符是y中不存在,则会将除去这个字符前的其他字符打印出来,有几个就打印几个[体现了 ?元字符前面的一个字符可以是0个y中原本的字符]
import re
a=re.findall("网络爬虫啊?","需要学习网络爬虫,我喜欢学习网络爬虫")
print(a)
#打印出['网络爬虫', '网络爬虫']
(4) .* 贪心算法
import re
a = "我xxIxx喜欢xxlovexx你xxyouxx"
b=re.findall("xx.*xx",a)
print(b)
#打印出['xxIxx喜欢xxlovexx你xxyouxx']
(5) .*? 非贪心算法
import re
a = "我xxIxx喜欢xxlovexx你xxyouxx"
b=re.findall("xx.*?xx",a)
print(b)
#打印出['xxIxx', 'xxlovexx', 'xxyouxx']
(6) ()内的数据作为结果输出
import re
a = "我xxIxx喜欢xxlovexx你xxyouxx"
b=re.findall("xx(.*?)xx",a)
print(b)
#打印出['I', 'love', 'you']
4.总结
文章总结了爬虫的用的频率较高的正则表达式中的一些基本使用方法。对于网络爬虫来说,重要的是要能从网页中提取信息。