【Python】【进阶篇】七、Python爬虫的re模块
Python 爬虫在网页数据采集中扮演着重要角色,而 re 模块是其中不可或缺的一部分。re 模块提供了一组函数,可以用来进行正则表达式匹配和处理字符串。本文将介绍 re 模块的常用方法、功能标志位、正则表达式分组以及网页信息提取。 7.1 re 模块常用方法 re 模块中常用的方法包括: 7.1.1 re.compile() 该方法用于生成正则表达式对象,其语法格式如下: ```python re.compile(pattern, flags=0) ``` 其中,pattern 是正则表达式字符串,flags 是标志位,表示对正则表达式的处理方式,具体参见 7.2 节。该方法返回一个正则表达式对象,后面的操作都需要用到这个对象。 7.1.2 re.findall() 该方法用于在字符串中查找符合正则表达式的所有子串,并将它们以列表形式返回。其语法格式如下: ```python re.findall(pattern, string, flags=0) ``` 其中,pattern 是正则表达式字符串,string 是待查询的字符串,flags 是标志位。 7.1.3 regex.findall() 该方法与 re.findall() 类似,但在处理 Unicode 字符串或者使用 Unicode 范围的正则表达式时,用该方法能够避免一些问题。其语法格式如下: ```python regex.findall(pattern, string, flags=0) ``` 其中,pattern 是正则表达式字符串,string 是待查询的字符串,flags 是标志位。 7.1.4 re.split() 该方法用于根据正则表达式分割字符串,并返回分割后的子串列表。其语法格式如下: ```python re.split(pattern, string, maxsplit=0, flags=0) ``` 其中,pattern 是正则表达式字符串,string 是待分割的字符串,maxsplit 是指定最多进行几次分割,flags 是标志位。 7.1.5 re.sub() 该方法用于在字符串中查找符合正则表达式的子串,并将其替换为指定的字符串。其语法格式如下: ```python re.sub(pattern, repl, string, count=0, flags=0) ``` 其中,pattern 是正则表达式字符串,repl 是替换后的字符串,string 是待处理的字符串,count 指定替换次数,flags 是标志位。 7.1.6 re.search() 该方法用于在字符串中查找第一个符合正则表达式的子串,并返回 MatchObject 对象。其语法格式如下: ```python re.search(pattern, string, flags=0) ``` 其中,pattern 是正则表达式字符串,string 是待处理的字符串,flags 是标志位。 7.2 flags 功能标志位 flags 是 re 模块中一些方法的可选参数,用于指定对正则表达式的处理方式。常用的 flags 包括: - re.IGNORECASE (re.I):忽略大小写。 - re.MULTILINE (re.M):多行匹配。 - re.DOTALL (re.S):`.` 匹配所有字符。 - re.UNICODE (re.U):开启 Unicode 匹配模式。 - re.LOCALE (re.L):开启本地化识别模式。 7.3 正则表达式分组 正则表达式分组可以将一个复杂的正则表达式分成多个小组,方便处理。使用 `()` 符号将要分组的部分括起来即可。在执行正则表达式匹配时,加上 `()` 符号后,匹配结果会以元组的形式返回。例如: ```python import re text = "hello, world!" m = re.search("(\w+), (\w+)!", text) print(m.group(0)) # hello, world! print(m.group(1)) # hello print(m.group(2)) # world ``` 以上代码中,正则表达式 `(\w+), (\w+)!` 将字符串分成了两个小组,对应的分别是 `,` 前面的单词和 `!` 前面的单词。search() 方法查找第一个符合正则表达式的子串,并返回 MatchObject 对象。MatchObject 对象的 group() 方法可以获取指定分组的结果。 7.4 网页信息提取 使用 re 模块进行网页信息提取时,需要先从网页中提取出文本内容,然后再对文本内容进行正则表达式匹配。例如: ```python import requests import re url = "https://www.baidu.com" response = requests.get(url) text = response.text # 提取网页标题 pattern_title = '