文章目录
写在前面
因为最近在中国大学MOOC网上学习嵩天老师(北京理工大学)的爬虫课程,所以为了方便自己以后编程时查找相关函数和方法,也为了方便各位小伙伴们学习,整理这篇关于爬虫中Re正则表达式库的基本知识点。本篇涉及图的地方,我会截取课程内容的截图(因为我实在是懒得画图了),涉及表的地方我会重新制作,一是为了美观,二是为了加深印象,因为函数和方法太多不常用的话就会遗忘。好了。话不多说,开干!
一、正则表达式的概念
1.基本概念
正则表达式(regular expression):用来简洁表达一组字符串的表达式。
(1)通用的字符串表达框架
(2)简洁表达一组字符串的表达式
(3)针对字符串表达"简介"和"特征"思想的工具
(4)判断某字符串的特征归属
2.作用
(1)表达文本类型的特征(病毒、入侵等)
(2)同时查找或替换一组字符串
(3)匹配字符串的全部或部分
3.编译
将符合正则表达式语法的字符串转换成正则表达式特征:p = re.compile( regex ), 特征可以表达一组字符串
二、正则表达式的语法
1.常用操作符
操作符 | 说明 | 实例 |
---|---|---|
. | 表示任何单个字符 | |
[ ] | 字符集,对单个字符给出取值范围 | [abc],表示a,b,c,[a-z]表示a到z的单个字符 |
[^] | 非字符集,对单个字符给出排除范围 | [^abc]表示非a或b或c的单个字符 |
* | 前一个字符0次或无限次扩展 | abc*表示ab,abc,abccccc等 |
+ | 表示前一个字符一次或无限次扩展 | abc+表示abc,abcc,abccc等 |
? | 前一个字符0次或1次扩展 | abc?表示ab,abc |
丨 | 左右表达式任取其一 | abc |
{m} | 扩展前一个字符m次 | ab{2}c表示abbc |
{m,n} | 扩展前一个字符m至n次(含n) | ab{1,2}c表示abc,abbc |
^ | 匹配字符串开头 | ^abc表示abc且在一个字符串的开头 |
$ | 匹配字符串结尾 | abc$表示abc且在一个字符串结尾 |
() | 分组标记,内部只能使用 | 操作符 |
\d | 数字,等价于[0-9] | |
\w | 单词字符,等价于[A-Za-z0-9_] |
2.正则表达式语法实例
3.经典正则表达式实例
4.正则表达式的类型
(1) raw string类型(原生字符串类型,不包含转义符的类型):r’text’, 如r’\d{3}-\d{8}|\d{4}-\d{7}’
(2) string类型,将\理解为转义符,使用更繁琐:如’\d{3}-\d{8}|\d{4}-\d{7}’
(3) 当正则表达式包含转义字符,使用raw string类型
三、Re库的基本使用
1.Re库主要功能函数:
函数 | 说明 |
---|---|
re.search(pattern,string,flags=0) | 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象 |
re.match(pattern,string,flags=0) | 从一个字符串的的开始位置起匹配正则表达式,返回match对象 |
re.findall(pattern,string,flags=0) | 搜索字符串,以列表类型返回全部能匹配的字符串 |
re.split(pattern,string,maxsplit=0,flags=0) | 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型 |
re.finditer(pattern,string,flags=0) | 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象 |
re.sub(pattern,repl,string,count=0,flags=0) | 在一个字符串中替换所有匹配正则表达式的字串,返回替换后的字符串 |
2.Re库的另一种等价用法
# 函数式用法:一次性操作
rst = re.search(r'[1-9]\d{5}', 'BIT 100081')
# 面向对象用法:编译后的多次操作
pat = re.compile(r'[1-9]\d{5}')
rst = pat.search('BIT 100081')
# 真正的正则表达式
regex = re.compile(pattern, flags = 0)
四、Re库的match对象
属性 | 说明 | 方法 | 说明 |
---|---|---|---|
.string | 待匹配文本 | .group(0) | 获得匹配后的字符串 |
.re | 匹配时使用的pattern对象(正则表达式) | .start() | 匹配字符串在原始字符串的开始位置 |
.pos | 正则表达式搜索文本的开始位置 | .end() | 匹配字符串在原始字符串的结束位置 |
.endpos | 正则表达式搜索文本的结束位置 | .span() | 返回(.start(), .end()) |
五、Re库的贪婪匹配和最小匹配
1.贪婪匹配和最小匹配:
Re库默认采用贪婪匹配,即输出匹配最长的字串。
# 贪婪匹配
match = re.search(r'PY.*N', 'PYANBNCNDN')
# 最小匹配
match = re.search(r'PY.*?N', 'PYANBNCNDN')
2.最小匹配操作符
操作符 | 说明 |
---|---|
*? | 前一个字符0次或无限次扩展,最小匹配 |
+? | 前一个字符1次或无限次扩展,最小匹配 |
?? | 前一个字符0次或1次扩展,最小匹配 |
{m,n}? | 扩展一个字符m至n次(含n),最小匹配 |
六、实例
这两个列子我之前在博客中写过,这里附上传送门,有需要的小伙伴可以参考。
实例1:淘宝商品比价定向爬虫
https://blog.csdn.net/weixin_44578172/article/details/109356900
实例2:股票数据定向爬虫
https://blog.csdn.net/weixin_44578172/article/details/109391135
本篇完,如有错误欢迎指出~
引用源自
中国大学MOOC Python网络爬虫与信息提取
https://www.icourse163.org/course/BIT-1001870001
CSDN博客
https://blog.csdn.net/songhui1024/article/details/84575575