爬虫必学知识之正则表达式上篇
这是日常学python的第12篇文章
在向网页进行了提交请求之类的之后,我们可以得到了网页的返回内容,里面自然而然会有我们想要的数据,但是html元素文本这么多,我们不可能一 一去找我们需要的数据,这时就需要用到正则表达式了,正则表达式是学爬虫必须学的内容,而且不止python可以用,java等其他语言都可以用,所以学了好处大大。
什么是正则表达式?
正则表达式就是一个特殊的字符序列,可以用于检测一个字符串是否与我们的所设定的字符串相匹配。功能有快速检索文本和快速替换一些文本的操作。
python里面有个处理正则表达式的库 re。有个方法
findall(pattern,string,flags)
用来匹配正则达式,我们就先用这个方法处理下。
参数如下:
- pattern:正则表达式
- string:要进行匹配的字符串
- flags:匹配的模式
结果是一个匹配内容的列表
'd' : 这个表示匹配单个0-9数字
'D' : 与d相反,匹配数字以外的内容
用代码来感受下:
import re#这个库是用来使用正则表达式的
a='sg+sga5g45gaae3f23hgt13'
r=re.findall('d',a)#这个就是根据d的正则表达式来查找对应字符,其中d是对应0-9的数字
#查找非数字用D
r1=re.findall('D',a)
print(r)
print(r1)
#结果
['5', '4', '5', '3', '2', '3', '1', '3']
['s', 'g', '+', 's', 'g', 'a', 'g', 'g', 'a', 'a', 'e', 'f', 'h', 'g', 't']
可以看到找出了字符串中的数字和非数字
本文出自公众号「日常学python」
如果我们在匹配一个字符串时,中间内容是有多个变化的,我们需要应变多种不同的字符,如这个字符串
a='abc,acc,agc,anc,afc,adc,aec'
如果需要匹配这个字符串时,我们就需要用到 [ ] ,用中括号括起来的字符,里面的内容表示或关系,那来看看代码
import re
a='abc,acc,agc,anc,afc,adc,aec'
#现在查找上面的中间字符为c或者f的字符串
#这个要求可以用到字符集来实现
r=re.findall('a[cf]c',a)#[]表示字符集,里面的内容是或关系
# 结果
['acc', 'afc']
上面匹配了中间字符是c或者是f的字符串,匹配中间字符非c和非f,可以在前面加个 ^ 符号
import re
r=re.findall('a[……cf]c',a)#[c-f]就是表示从c到f
print(r)
# 结果
['abc', 'agc', 'anc', 'adc', 'aec']
上面只处理了中间字符为chu者f的字符串,但是没有匹配全部的,若要匹配全部,可以加个 - 符号,表示范围,如下
import re
r=re.findall('a[b-n]c',a)#[c-f]就是表示从c到f
print(r)
# 结果
['abc', 'acc', 'agc', 'anc', 'afc', 'adc', 'aec']
[b-n]:这个就是表示b到n的字符
匹配汉字:[u4E00-u9FA5]
概括字符集:
用一个 + 字母 表示一系列的字符的元字符,只能匹配单个字符,常用的如下
- w:匹配数字和字符「不包括&符号」只匹配单词,数字和下划线
- W:与w相反,这个包括空格和回车
- s:匹配空格字符,如空格,回车和制表符
- S:与s相反
- .:匹配除换行符之外的其他字符
- 还有前面的d和D也是
有个小技巧:如果想要匹配所有字符,就可以把上面的两个相反的合并起来就可以了。
代码如下:
#概括字符集,就是用一个加个字母来表示一类字符,比如刚开始的d,D
import re
a='hdskn122rs3$ dkl%df36t5&'
r=re.findall('w',a)#这个是匹配数字和单词
print(r)
#也可以匹配非数字非单词
r=re.findall('W',a)
print(r)
#匹配空格字符和制表符等其他字符
r=re.findall('s',a)
print(r)
#匹配除换行符之外的其他字符
r=re.findall('.',a)
print(r)
# 结果
['h', 'd', 's', 'k', '1', '2', '2', 's', '3', 'd', 'k', 'l', 'd', 'f', '3', '6', '5']
['n', 'r', '$', ' ', '%', 't', '&']
['n', 'r', ' ', 't']
['h', 'd', 's', 'k', '1', '2', '2', 'r', 's', '3', '$', ' ', 'd', 'k', 'l', '%', 'd', 'f', '3', '6', 't', '5', '&']
数量词:
当一个字符需要连续重复匹配多次时,就要用到这个。如匹配三个字符组成的字符串:
[a-zA-z]{3} ,大括号里面的表示重复次数。
若要匹配三到六个字符,大括号的就需要这样写:{3,6}.
代码如下;
#数量词,当一个字符需要多次重复匹配时就需要用到
import re
a='python java111php23 html'
r=re.findall('[a-z]{3}',a)#重复多次就用大括号,括号内的数表示重复的次数
print(r)
#也可以重复一个范围,表示匹配3到6个字符
r=re.findall('[a-z]{3,6}',a)
print(r)#这样就可以把单词都找出来了
# 结果
['pyt', 'hon', 'jav', 'php', 'htm']
['python', 'java', 'php', 'html']
其他数量词表示:
- * :匹配零次或无限多次
- +:匹配一次或以上
- ?:匹配零次或者一次
a='pytho243python34pythonn'
#*表示匹配对应内容0次或者无限次
r=re.findall('python*',a)#这个就是代表对n字符的数量词匹配
print(r)
#+表示匹配内容1次或者无限次
r=re.findall('python+',a)
print(r)
#?表示可以匹配0次或者1次,注意这个?和上面的非贪婪代表的意思不一样
r=re.findall('python?',a)
print(r)
# 结果
['pytho', 'python', 'pythonn']
['python', 'pythonn']
['pytho', 'python', 'python']
贪婪匹配:正则表达式默认为贪婪匹配,即匹配符合字符串的最大长度,如上面的[a-zA-z]{3,6},他会趋于匹配长度为6的字符串,匹配到条件不满足时才停止匹配。
非贪婪匹配:就是趋于匹配长度最小的字符串,匹配满足第一个条件就会停止匹配
r=re.findall('[a-z]{3,6}',a)# 贪婪匹配
print(r)
r=re.findall('[a-z]{3,6}?',a)
print(r)#由于是非贪婪,所以匹配当第一个条件满足时就停止匹配
# 结果
['python', 'java', 'php', 'html']
['pyt', 'hon', 'jav', 'php', 'htm']
END
这篇文章只是介绍了下正则表达式的简单用法,可以用来入门正则,下一篇文章讲正则表达式高级点的用法。
留个小练习:写一个正则来匹配生日,字符串为:
- 2005-06-09
- 2005-6-9
- 2005 6 9
- 2005,06,09
可以把答案写在留言区哈!
上述文章如有错误欢迎在留言区指出,如果这篇文章对你有用,点个赞,转个发如何?
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(87)-MVC Excel导入和导出
- sl从程序集中读取xaml文件
- WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[实现篇]
- WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[扩展篇]
- 如何解决打开VS2010后没有UI界面的问题
- RadRails1.0降临——增加Profiler、CallGraph Analyzer和Rails Shell等新特性
- Rails存储库从SVN转向Git
- 报告称10后已变成出境游“老司机”屌丝80后:我还没出过国
- 担心人工智能取代你的工作?听听微软科学家怎么说!
- Radiant: 基于Ruby on Rails的内容管理系统
- “大数据”如何追回1.3亿元税款?
- Enterprise Library深入解析与灵活应用(5):创建一个简易版的批处理执行器,认识Enterprise Library典型的配置方式和对象创建方式
- BTC.com时讯-IBM等老牌大企业因区块链技术获得新活力
- Kit 3D 更新
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 巧用ingest pipeline实现Elasticsearch索引的重定向
- leetcode之错误的集合
- vue-element怎么给select下拉框赋值?
- vue 怎么将Checkbox 多选框选中的值提交
- Chrome的小恐龙游戏自动躲避障碍物
- Three.js教程(5):光源
- Three.js教程(6):几何体
- Three.js教程(7):材质
- Keep APP技术研究
- Canvas系列(15):实战-小球拖拽
- Canvas系列(16):实战-小球与斜面碰撞
- Three.js教程(3):场景
- Three.js教程(4):相机
- 使用GithubActions自动部署应用到自己的服务器(ECS)
- Nuxt项目给script标签添加crossorigin属性