Python3网络爬虫——(5)正则表达式(re模块)

简介: 一、正则表达式1、正则表达式是字符串搜索引擎 Python正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
一、正则表达式
1、正则表达式是字符串搜索引擎
Python正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
2、正则表达式在线测试工具: http://tool.oschina.net/regex

3、常见匹配模式:


4、正则表达式修饰符 - 可选标志
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:
修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

二、Python语言中的re模块拥有全部的正则表达式功能
1、re.match函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
函数语法
re . match ( pattern , string , flags = 0 )
函数参数说明:
参数
描述
pattern
匹配的正则表达式
string
要匹配的字符串。
flags
标志位,用于控制正则表达式的匹配方式
匹配成功re.match方法返回一个匹配的对象,否则返回None。
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
匹配对象方法
描述
group(num=0)
匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups()
返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
(1)最常规的匹配
import re
content='Hello 123 4567 World_This is a Regex Demo'
result=re.match('^Hello\s\d\d\d\s\d{4}\s\w{10}.*Demo$',content)
print(len(content))
print(result)
print(result.group()) #输出匹配的整个表达式字符串
print(result.span()) #输出匹配结果的范围


(2)泛匹配
import re
content='Hello 123 4567 World_This is a Regex Demo'
result=re.match('^Hello.*Demo$',content)
print(result.group()) #输出匹配的整个表达式字符串
结果为:Hello 123 4567 World_This is a Regex Demo

(3)匹配目标
import re
content='Hello 1234567 World_This is a Regex Demo'
result=re.match('^Hello\s(\d+)\sWorld.*Demo$',content)
print(result.group()) #输出匹配的整个表达式字符串
print(result.group(1))#获取匹配目标(即小括号内的字符串)


(4)贪婪匹配
import re
content='Hello 1234567 World_This is a Regex Demo'
result=re.match('^He.*(\d+).*Demo$',content)# .*匹配尽可能多的字符
print(result.group()) #输出匹配的整个表达式字符串
print(result.group(1))#获取匹配目标(即小括号内的字符串)


(5)非贪婪匹配
import re
content='Hello 1234567 World_This is a Regex Demo'
result=re.match('^He.*?(\d+).*Demo$',content)#  .*?匹配尽可能少的字符
print(result.group()) #输出匹配的整个表达式字符串
print(result.group(1))#获取匹配目标(即小括号内的字符串)


(6)匹配模式
import re
content='Hello 1234567 World_This ' \
        'is a Regex Demo'
result=re.match('^He.*?(\d+).*?Demo$',content,re.S)  #re.S匹配换行符
print(result.group()) #输出匹配的整个表达式字符串
print(result.group(1))#获取匹配目标(即小括号内的字符串)


(7)转义
import re
content='price is $5.00'
result=re.match('price is \$5\.00',content) #特殊字符用转义
print(result.group())  #price is $5.00
总结:
尽量使用泛匹配、使用括号得到匹配目标、尽量使用非贪婪模式,有换行符就用re.S

2、re.search函数
re.search 扫描整个字符串并返回第一个成功的匹配。
函数语法:
re . search ( pattern , string , flags = 0 )
函数参数说明:
参数
描述
pattern
匹配的正则表达式
string
要匹配的字符串。
flags
标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
匹配成功re.search方法返回一个匹配的对象,否则返回None。
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
匹配对象方法
描述
group(num=0)
匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups()
返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
例子:
import re
content='Extra strings Hello 1234567 World_This is a Regex Demo Extra strings'
result=re.search('Hello.*?(\d+).*?Demo',content)
print(result)
print(result.group(1))

总结 为匹配方便,能用search就不用match
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配

3、re.findall函数
re.findall搜索字符串,在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
注意:  match 和 search 是匹配一次 findall 匹配所有。
语法格式为:
findall ( string [, pos [, endpos ]])
参数:
  • string : 待匹配的字符串。
  • pos : 可选参数,指定字符串的起始位置,默认为 0。
  • endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。
例1:

例2(拿到所有的歌名信息):


4、re.sub函数
re.sub 替换字符串中每一个匹配的子串后返回替换后的字符串。
语法:
re . sub ( pattern , repl , string , count = 0 , flags = 0 )
参数:
  • pattern : 正则中的模式字符串。
  • repl : 替换的字符串,也可为一个函数。
  • string : 要被查找替换的原始字符串。
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
import re
content='Extra strings Hello 1234567 World_This is a Regex Demo Extra strings'
content1=re.sub('\d+','',content)
print(content1)
content2=re.sub('\d+','Replacement',content)
print(content2)                                              #r 表示字符串为非转义的原始字符串
content3=re.sub('(\d+)',r'\1 8910',content)  # \1是把第一个括号里的内容拿过来
print(content3)
结果:


5、re.compile函数
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
语法格式为:
re . compile ( pattern [, flags ])
参数:
  • pattern : 一个字符串形式的正则表达式
import re
content='Hello 1234567 World_This ' \
        'is a Regex Demo'
pattern=re.compile('Hello.*Demo',re.S)
result=re.match(pattern,content)
print(result)


6、re.finditer函数
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
re . finditer ( pattern , string , flags = 0 )
参数:
参数
描述
pattern
匹配的正则表达式
string
要匹配的字符串。
flags
标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
import re
content='12a32bc43jf3'
it=re.finditer(r'\d+',content)
for mat in it:
    print(mat.group())


7、re.split函数
re.split(pattern, string[, maxsplit])按照能够匹配的子串将string分割后返回列表。maxsplit用于指定最大分割次数,不指定将全部分割。
import re
content='one1two2three3four4'
result=re.split(r'\d+',content)
print(result)    #['one', 'two', 'three', 'four', '']
实战练习:爬取豆瓣图书相关信息

爬取结果:














相关文章
|
1月前
|
搜索推荐 程序员 调度
精通Python异步编程:利用Asyncio与Aiohttp构建高效网络应用
【10月更文挑战第5天】随着互联网技术的快速发展,用户对于网络应用的响应速度和服务质量提出了越来越高的要求。为了构建能够处理高并发请求、提供快速响应时间的应用程序,开发者们需要掌握高效的编程技术和框架。在Python语言中,`asyncio` 和 `aiohttp` 是两个非常强大的库,它们可以帮助我们编写出既简洁又高效的异步网络应用。
127 1
|
13天前
|
Python
Python中的异步编程:使用asyncio和aiohttp实现高效网络请求
【10月更文挑战第34天】在Python的世界里,异步编程是提高效率的利器。本文将带你了解如何使用asyncio和aiohttp库来编写高效的网络请求代码。我们将通过一个简单的示例来展示如何利用这些工具来并发地处理多个网络请求,从而提高程序的整体性能。准备好让你的Python代码飞起来吧!
35 2
|
20天前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
63 6
|
11天前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
28 5
|
9天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
38 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
13天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
利用Python和TensorFlow构建简单神经网络进行图像分类
利用Python和TensorFlow构建简单神经网络进行图像分类
39 3
|
19天前
|
数据采集 存储 XML
Python实现网络爬虫自动化:从基础到实践
本文将介绍如何使用Python编写网络爬虫,从最基础的请求与解析,到自动化爬取并处理复杂数据。我们将通过实例展示如何抓取网页内容、解析数据、处理图片文件等常用爬虫任务。
111 1
|
21天前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
47 4
|
21天前
|
网络协议 物联网 API
Python网络编程:Twisted框架的异步IO处理与实战
【10月更文挑战第26天】Python 是一门功能强大且易于学习的编程语言,Twisted 框架以其事件驱动和异步IO处理能力,在网络编程领域独树一帜。本文深入探讨 Twisted 的异步IO机制,并通过实战示例展示其强大功能。示例包括创建简单HTTP服务器,展示如何高效处理大量并发连接。
39 1
|
23天前
|
数据采集 存储 机器学习/深度学习
构建高效的Python网络爬虫
【10月更文挑战第25天】本文将引导你通过Python编程语言实现一个高效网络爬虫。我们将从基础的爬虫概念出发,逐步讲解如何利用Python强大的库和框架来爬取、解析网页数据,以及存储和管理这些数据。文章旨在为初学者提供一个清晰的爬虫开发路径,同时为有经验的开发者提供一些高级技巧。
16 1