爬虫应用场景
搜索引擎,它无时无刻不在爬虫,用于供给用户关键字更多的选择
推荐引擎,爬取大量数据来实现个性化推荐
机器学习的数据样本,可以爬取相关数据来训练模型
数据分析,数据分析本身需要大量数据才能有效分析
正则表达式
css实际上最细只能细化到一个标签中的内容,但是正则表达式可以取到我们想要的字符,过滤掉不需要的字符,可操作性更高了。
re包
match
(匹配对象,正则表达式) 返回boolean,匹配成功true,匹配失败falsegroup
匹配正则表达式中的圆括号,从外往里面匹配
例如 a(bc):group(0)对应abc,group(1)对应bc
特殊字符
^ $ * ? + {2} {2,} {2,5} |
[]``[^] [a-z]
\s \S \w \W
[\u4E00-\u9FA5] () \d
^ 字符
以什么字符开头
ps:只能匹配整个字符串的第一个字符为首
^b指定以b开头
.代表一个字符
.*代表任意多个字符
regex = "^b.*"
line = "bobby123"
regex = "^b.*"
if re.match(regex,line):
print(true)
$ 字符
以什么字符结尾
ps:中文可能会不识别
.*3$ 任意多字符开头,以3结尾
?字符
用于实现非贪婪
贪婪
什么是贪婪?下面案例就是所谓的贪婪匹配模式,一个正则表达式它会从右往左开始匹配,从右往左读正则表达式可以发现输出的就是bb。简单一句话,从右往左匹配正则表达式就是贪婪的。
import re
line = "boooobby123"
regex = ".*(b.*b).*"
match_obj = re.match(regex,line)
print(match_obj.group(1))
输出 bb
非贪婪
非贪婪就是让它从正则表达式的左边往右边读取,怎么做,在原先贪婪的基础上加上两个问号,如果不加后一个问号,它就会采取最贪婪的方式,匹配到boooobb,一直到最后一个b,所以我们需要在不需要贪婪的字符前加一个问号,让它别“太贪“
import re
line = "boooobby123"
regex = ".*?(b.*b).*"
match_obj = re.match(regex,line)
print(match_obj.group(1))
+字符
+字符和字符做一个区别理解,+号是规定至少出现一次,是任意次数
import re
line = "boooobbby123"
regex = ".*(b.+b).*"
match_obj = re.match(regex,line)
print(match_obj.group(1))
输出 bbb
{ }字符
*号是匹配所有,{ }花括号则是可以允许定制,显示一个字符或者几个字符。记一下该字符是写在目标字符的后面
import re
line = "boooobbby123"
regex = ".*(b.{1}b).*"
match_obj = re.match(regex,line)
print(match_obj.group(1))
输出 bbb
{2}字符
{2,5}字符
|字符
或的作用,这里面是有优先级关系的,比如下面这个案例,两者都符合的情况下,左边的比右边的优先级高
import re
line = "bobby123"
regex = "bobby123|bobby"
match_obj = re.match(regex,line)
print(match_obj.group(0))
输出 bobby123
[ ] 字符
正则表达式会匹配中括号里面的字符,以中括号中间的任意字符开头,
import re
line = "bobby123"
regex = "[b,c,d,e]obby123"
match_obj = re.match(regex,line)
print(match_obj.group(0))
输出 bobby123
[^] 字符
[0-9] 字符
匹配0-9的字符串
多拼接语法格式 [A-Za-z0-9] 可以发现并没有用逗号隔开等等,而是直接拼接
\s字符
匹配空格。只匹配单空格
import re
line = "你 好"
regex = "你\s好"
match_obj = re.match(regex,line)
print(match_obj.group(0))
输出:你 好
\S字符
匹配除了空格之外的。只匹配单字符
import re
line = "你们好"
regex = "你\s好"
match_obj = re.match(regex,line)
print(match_obj.group(0))
输出:你 好
\w字符
\W字符
[\u4E00-\u9FA5]字符
匹配所有中文字符
import re
line = "study in 南京大学"
regex = ".*?([\u4E00-\u9FA5]+大学)"
match_obj = re.match(regex,line)
print(match_obj.group(1))
\d字符
数字类型
综合案例
需要注意:-这个字符很敏感,尽量放在头尾不要放在中间,可能会报错
import re
line = "XXX出生于2001/6/1"
# line = "XXX出生于2001-6-1"
# line = "XXX出生于2001年06月01日"
# line = "XXX出生于2001-06"
regex = ".*出生于(\d{4}[-/年]\d{1,2}([-月/]\d{1,2}|[-月/]$|$))"
match_obj = re.match(regex,line)
print(match_obj.group(1))
不妨多几个空格拆分以下看看结构,注意拆分只能用于看清正则结构,并不能被编译器编译。尤其是后面的“或结构“模型可以重点看看
regex = ".*出生于(\d{4}[-/年]\d{1,2} ([-月/]\d{1,2} | [-月/]$ | $))"