Python爬虫教程:正则表达式深度解析

0 下载量 117 浏览量 更新于2024-08-29 收藏 787KB PDF 举报
"这篇教程是关于Python爬虫学习与教学的第三部分,主要讲解了正则表达式的使用。" 在Python编程中,正则表达式(Regular Expression)是一种强大的文本处理工具,它能用于搜索、替换和提取符合特定模式的字符串。在爬虫开发中,正则表达式常用于解析和提取网页中的数据。本教程首先引入了`re`模块,它是Python内置的正则表达式库,用于处理正则表达式。 `re.search()`函数用于在字符串中查找第一个匹配正则表达式的子串。它返回一个匹配对象,如果未找到匹配项,则返回`None`。示例中的`r`前缀表示原始字符串,确保字符串中的反斜杠 `\` 不被当作转义字符处理。 正则表达式中的`.`字符代表任意单个字符,这与Linux命令行工具`grep`中的`.`用法相似。为了匹配IP地址,我们可以编写一个复杂的正则表达式,例如: ```python re.search(r'((\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])', '192.10.160.10') ``` 此正则表达式由四个部分组成,每个部分匹配0-255之间的数字,中间用点分隔。这可以有效地捕获IPv4地址。 正则表达式的一个关键概念是贪婪和非贪婪模式。默认情况下,正则表达式会尝试匹配尽可能多的字符,这就是贪婪模式。若要改为非贪婪模式,只需在量词(如`*`、`+`、`?`)后面添加`?`,使正则表达式尽可能少地匹配字符。 `\A`和`\Z`分别用于匹配字符串的开始和结束位置。`^`匹配行首,而`$`匹配行尾,但它们在使用时不区分多行模式。 举例来说,`\B`和`\b`用于匹配单词边界。如果不想匹配含有下划线的单词,可以利用这两个标志。 正则表达式还可以通过编译(`re.compile()`)来提高性能,编译后的模式可以重复使用。`search()`和`match()`函数都会返回匹配对象,其中`start()`和`end()`方法可以获取匹配的开始和结束索引,`span()`返回一个元组,包含匹配的起始和结束索引。`findall()`方法返回所有匹配的子串,结果是一个列表。 在处理HTML或XML文档时,正则表达式常用于提取链接或图片地址。例如,以下代码片段展示了如何使用正则表达式从HTML字符串中提取图片URL: ```python def get_img(html): p = r'<img class="BDE_Image" src="([^"]+\.jpg)"' img_list = re.findall(p, html) return img_list ``` 这段代码查找所有`<img>`标签,其中`class`属性为`BDE_Image`,并且`src`属性指向以`.jpg`结尾的URL。`findall()`返回这些URL组成的列表。 在编写复杂的正则表达式时,可以使用`VERBOSE`标志(`re.VERBOSE`),这样可以在正则表达式中添加注释,并使用空格和换行来提高可读性。例如: ```python pattern = re.compile(r""" <img # 开始的<img标签 class="BDE_Image" # 类名为BDE_Image src=" # src属性开始 ([^"]+\.jpg) # 图片URL,直到双引号结束,且以.jpg结尾 " # src属性的双引号结束 """, re.VERBOSE) ``` 正则表达式是Python爬虫中不可或缺的一部分,用于高效地处理和提取数据。通过熟练掌握正则表达式,可以极大地提高数据提取的效率和准确性。