文章目录
1.正则表达式:RE(regular expression)。(W)
▪用来简洁表达一组字符串的表达式
▪通用的字符串表达框架
▪针对字符串表达"简洁"和"特征"思想的工具
▪判断某字符串的特征归属
2.为什么使用正则表达式?(W)
●简洁
3.如何使用正则表达式?(H)
编译:将符合正则表达式语法的字符串转换成正则表达式特征。(使用re库)
bs4模块通过css selector定位html标签爬取数据,而正则表达式通过字符串匹配html标签爬取数据。
4.正则表达式的语法:
由字符和操作符构成
5.正则表达式的常用操作符:
. 表示任何单个字符
[ ] 字符集,对单个字符给出取值范围 如:[abc]:a、b、c,[a-z]:a到z单个字符
[^ ](非) 非字符集,对单个字符给出排除范围 如:[^abc]:非a/b/c的单个字符
* 前一个字符0次或无限次扩展 如:abc*:ab/abc/abcc/abccc......
+ 前一个字符1次或无限次拓展 如:abc+:abc/abcc/abccc.....
? 前一个字符0次或1次拓展 如:abc?:ab/abc
| (或) 左右表达式任意一个 如:abc|def:abc/def
{m} 扩展前一个字符m次 如:ab{2}c:abbc
{m,n} 扩展前一个字符m-n次, (m,n] 如:ab{1,2}c:abc/abbc
^ 匹配字符串开头 如:^abc表示abc且且且在一个字符串的开头
$ 匹配字符串结尾 如:abc$表示abc且且且在一个字符串的结尾
() 分组标记,内部只能使用|操作符 如:(abc):abc,(abc|def):abc/def
\d 数字,等价于[0-9]
\w 单词字符,等价于[A-Za-z0-9_] 任一字母、数字或下划线(单词字符)
\s 空白字符,例如空格、制表符、换行符等,等价于[\f\n\r\t\v]
(\D=\^d)
6.正则表达式实例:
^[A-Za-z]+$ 由26个字母组成的字符串
^[A-Za-z0-9]+$ 由26个字母和数字组成的字符串
^-?\d+$ 整数形式的字符串
^[0-9]*[1-9][0-9]*$ 正整数形式的字符串
[1-9]\d{5} 中国境内邮政编码,6位
[\u4e00-\u9fa5] 匹配中文字符
\d{3}-\d{8}|d{4}-\d{7} 国内电话号码
[a-zA-Z]+://[^\s]*[.com|.cn] 匹配.com/.cn后缀的url地址
7.正则表达式的表示类型:
re库采用raw String 类型表示正则表达式,表示为:r’text’
●raw String(原生字符串类型):不包含转义符的字符串。
建议:当正则表达式中包含 转义符 时,使用raw String类型。(不繁琐)
8.re库主要功能函数:
re.search(pattern,string,flags=0):在字符串中搜索与正则表达式一样的地方,返回第一个匹配上的内容,为match对象。
re.match(pattern,string,flags=0):只在开始位置匹配,是则返回match对象,否则返回none。(从头)
re.findall(pattern,string,flags=0):搜索字符串,返回所有匹配上的内容,类型为字符串列表或元组列表
re.split(pattern,string,maxsplit=0,flags=0):将一个字符串按照正则表达式匹配结果进行分割,返回列表类型
re.sub(pattern,repl,string,count=0,flags=0):查找匹配并替换
re.compile(pattern,flags=0):将正则表达式的字符串形式编译成正则表达式对象(面向对象)
pattern:raw String/String, string:待匹配字符串, flags:正则表达式使用时的控制标记
maxsplit:最大分割数,剩余部分作为最后一个元素输出。(maxsplit=1,则只分割一个)
repl:替换匹配字符串的字符串。count:匹配的最大替换次数
flags:
re.I re.IGNORECASE 忽略正则表达式的大小写,[A-Z]能够匹配小写字符
re.M re.MULTILINE 正则表达式中的^操作符能够将给定字符串的每行当作匹配开始
re.S re.DOTALL 正则表达式中的.操作符能够匹配所有字符
9.match对象:
match对象的属性:
(1).string:待匹配的文本
(2).re:匹配时使用的pattern对象(正则表达式)
(3).pos:正则表达式搜索文本的开始位置
(4).endpos:正则表达式搜索文本的结束位置
match对象的方法:
(1).group(n):group(0)输出全部子匹配,group(n)输出第n个括号的匹配结果
(2).start():匹配字符串在原始字符串的开始位置
(3).end():匹配字符串在原始字符串的结束位置
(4).sparn():返回(.start(),.end())
10.贪婪匹配和最小匹配:
Re库默认采用贪婪匹配,即输出匹配最长的字符串。
最小匹配操作符:(在贪婪匹配的基础上)
?、+?、??、{m,n}?
.?代表匹配任意字符。此处的?是非贪婪模式匹配(懒惰模式),一旦找到能匹配的字符就完成一次匹配,即最短距离匹配。
如果不加?则为贪婪模式匹配,.*进行最长距离匹配
11.子匹配与分组:
子匹配:()。
分组:一个正则表达式中可存在多个()/子匹配,把括号内的子匹配作为匹配返回结果。
若只需要获得子匹配的结果,可以使用re.findall方法,search和match都要返回完整匹配。
当只有一个括号(分组)时,findall返回类型为字符串列表,当存在两个及以上括号(分组)时,findall返回类型为元组的列表。