常用正则表达式最强汇总(含Python代码举例讲解+爬虫实战)

简介: 带大家学习正则表达式,并通过python代码举例讲解常用的正则表达式最后实战爬取小说网页:重点在于爬取的网页通过正则表达式进行解析。

大家好,我是辰哥~

本文带大家学习正则表达式,并通过python代码举例讲解常用的正则表达式

最后实战爬取小说网页:重点在于爬取的网页通过正则表达式进行解析。

正则表达式语法

Python的re模块(正则表达式)提供各种正则表达式的匹配操作。在绝大多数情况下能够有效地实现对复杂字符串的分析并取出相关信息。在讲解如何实际应用正则表达式之前,先教大家学习并掌握正则表达式的基本语法(匹配规则)。

正则表达式匹配过程如下:

(1)将定义好的正则表达式和字符串进行比较。

(2)如果每一个字符串都能匹配,则成功;一旦有匹配不成功的字符则匹配失败。

正则表达式规则

常见规则

数量词匹配规则

边界匹配规则

Re模块

Python中使用Re库去定义的正则表达式,常用的方法列举如下:

lpattern对象

re.compile(string[,flag])

l匹配所用函数

re.match(pattern, string[, flags])

re.search(pattern, string[, flags])

re.split(pattern, string[, maxsplit])

re.findall(pattern, string[, flags])

re.finditer(pattern, string[, flags])

re.sub(pattern, repl, string[, count])

re.subn(pattern, repl, string[, count])

其中pattern对象是由我们传入字符串对象,通过compile方法生成。利用这个对象来进行下一步的匹配。针对上述列举的各种正则表达式匹配规则和函数,下面通过Python代码进行举例讲解。

(1) re.match(pattern, string[, flags])

match函数将会从String(待匹配的字符串)的开头开始,尝试匹配pattern,一直向后匹配。如果中途匹配pattern成功,则终止匹配,返回匹配结果。如果无法匹配或者到字符串末尾还未匹配到,则返回None。

举例

#导入re模块
import re
pattern = re.compile(r'python')
# 使用re.match匹配文本,获得匹配结果,无法匹配时将返回None
result1 = re.match(pattern,'python')
result2 = re.match(pattern,'pythonn CQC!')
result3 = re.match(pattern,'pthon CQC!')
print(result1)
print(result2)
print(result3)
 
"""
结果:
<_sre.SRE_Match object; span=(0, 6), match='python'>
<_sre.SRE_Match object; span=(0, 6), match='python'>
None
""" 

(2) re.search(pattern, string[, flags])

Search函数会扫描整个string字符串查找匹配,存在的话返回匹配结果,不存在则返回None。

举例:

import re
pattern = re.compile(r'python')
#从“hello pythonnnnn!”中匹配“python”
result1 = re.search(pattern,'hello pythonnnnn!')
#从“hello pyhon!”中匹配“python”
result2 = re.search(pattern,'hello pyhon!')
print(result1)
print(result2)
 
"""
结果:
<_sre.SRE_Match object; span=(6, 12), match='python'>
None
"""

(3) re.split(pattern, string[, maxsplit])

split函数可以按照pattern匹配模式将string字符串分割后返回列表,其中maxsplit参数可以指定最大分割次数,不指定则将字符串全部分割。

      举例:

import re
#以一位或者多位数字作为分割间隔
pattern = re.compile(r'\d+')
print(re.split(pattern,'python1java2php3js'))
#只分割两次
print(re.split(pattern,'python1java2php3js',maxsplit=2))
 
"""
结果:
['python', 'java', 'php', 'js']
['python', 'java', 'php3js']
"""

(4) re.findall(pattern, string[, flags])

findall函数作用是搜索整个字符串,以列表形式返回全部能匹配的子串。

      举例:

import re
pattern = re.compile(r'\d+')
print(re.findall(pattern,'python1java2php3js2245'))
 
"""
结果:
['1', '2', '3', '2245']
"""

(5) re.finditer(pattern, string[, flags])

finditer函数作用是搜索整个字符串,返回一个符合匹配结果(Match对象)的迭代器。

      举例:


import re
#以一位或者多位数字作为搜索条件
pattern = re.compile(r'\d+')
#搜索结果得到一个集合,通过循环对集合遍历输出
for item in re.finditer(pattern,'python1java2php3js2245'):
  print(item.group())
 
"""
结果:
1
2
3
2245
"""

(6) re.sub(pattern, repl, string[, count])

先看两个例子,然后再解释这个sub函数的作用。

      举例:


import re
pattern1 = re.compile(r'music')
#例1中“i love the music”里的music替换成python
print(re.sub(pattern1, 'python', 'i love the music'))
pattern2 = re.compile(r'(\d+)')
#例2中“数字123 和9”被python替换。
print(re.sub(pattern2, 'python', 'My number is 123 and my favorite number is 9'))
 
"""
结果:
i love the python
My number is python and my favorite number is python
"""

(7) re.subn(pattern, repl, string[, count]) 

subn可以指定替换次数,不指定则默认替换全部。

举例:


import re
#以一位或者多位数字作为替换条件
pattern1 = re.compile(r'(\d+)')
#用“python”替换数字(一位或者多位),最后返回替换结果和替换次数
print(re.subn(pattern1, 'python', 'My number is 123 and my favorite number is 9'))
pattern2 = re.compile(r'(\d+)')
print(re.subn(pattern2, 'python', 'My number is 123 and my favorite number is 9',1))
 
"""
结果:
('My number is python and my favorite number is python', 2)
('My number is python and my favorite number is 9', 1)
"""

实战

需求:提取小说章节正文和标题

本节通过实战案例来讲解正则表达式的应用。案例目的是:提取小说章节内容。步骤是先采集到每一章小说正文内容网页源码,然后通过正则表达式将里面的正文提取出来。

这里爬取小说  第一章 北灵院,用正则表达式提取小说章节正文标题

目标链接:http://book.chenlove.cn/book/12242/39a44ff6dd27f.html

页面如下:

分析网页源码:

可以看到章节标题在h3标签中,其class为j_chapterName;正文内容在p标签中,清楚这些之后,下面开始编写代码请求网页源码,并编写正则表达式去提取标题和正文。

完整代码如下:


import requests
import re
import json
# 设置代理服务器
headers = {
    'User_Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'
}
#请求连接
url = "http://book.chenlove.cn/book/12242/39a44ff6dd27f.html"
response = requests.get(url, headers=headers)
if response.status_code == 200:
    # 转化为utf-8格式,不加这条语句,输出爬取的信息为乱码
    response.encoding = 'utf8'
    #获取到源码
    html = response.text
    # 正则表达式解析小说章节标题
    pattern1 = re.compile('<h3>(.+)</h3>')
    title = re.findall(pattern1, html)[0]
    #正则表达式解析小说章节正文内容
    text = re.findall(r"<p>(.*?)</p>", html,re.S)[2:-1][0].split("</div>")[0]
    # 打印输出
    print(title)
    print(text)
 
"""
结果:
第一章 北灵院
     烈日如炎,灼热的阳光从天空上倾洒下来,令得整片大地都是处于一片蒸腾之中,杨柳微垂,......
"""

可以看到第一章的标题和正文已经成功提取出来了,因为正文内容很长,这里仅展示部分。

最后

本文汇总正则表达式常用的基本语法,并结合Python进行举例演示

最后实战讲解正则表达式在爬虫中的应用。

相关文章
|
1天前
|
数据采集 存储 数据挖掘
深入剖析 Python 爬虫:淘宝商品详情数据抓取
深入剖析 Python 爬虫:淘宝商品详情数据抓取
|
4天前
|
存储 数据采集 数据库
Python爬虫实战:股票分时数据抓取与存储
Python爬虫实战:股票分时数据抓取与存储
|
23天前
|
存储 缓存 Java
Python高性能编程:五种核心优化技术的原理与Python代码
Python在高性能应用场景中常因执行速度不及C、C++等编译型语言而受质疑,但通过合理利用标准库的优化特性,如`__slots__`机制、列表推导式、`@lru_cache`装饰器和生成器等,可以显著提升代码效率。本文详细介绍了这些实用的性能优化技术,帮助开发者在不牺牲代码质量的前提下提高程序性能。实验数据表明,这些优化方法能在内存使用和计算效率方面带来显著改进,适用于大规模数据处理、递归计算等场景。
58 5
Python高性能编程:五种核心优化技术的原理与Python代码
|
28天前
|
运维 Shell 数据库
Python执行Shell命令并获取结果:深入解析与实战
通过以上内容,开发者可以在实际项目中灵活应用Python执行Shell命令,实现各种自动化任务,提高开发和运维效率。
56 20
|
30天前
|
数据采集 JSON 数据格式
Python爬虫:京东商品评论内容
京东商品评论接口为商家和消费者提供了重要工具。商家可分析评论优化产品,消费者则依赖评论做出购买决策。该接口通过HTTP请求获取评论内容、时间、点赞数等数据,支持分页和筛选好评、中评、差评。Python示例代码展示了如何调用接口并处理返回的JSON数据。应用场景包括产品优化、消费者决策辅助、市场竞争分析及舆情监测。
|
1月前
|
测试技术 数据库 Python
Python装饰器实战:打造高效性能计时工具
在数据分析中,处理大规模数据时,分析代码性能至关重要。本文介绍如何使用Python装饰器实现性能计时工具,在不改变现有代码的基础上,方便快速地测试函数执行时间。该方法具有侵入性小、复用性强、灵活度高等优点,有助于快速发现性能瓶颈并优化代码。通过设置循环次数参数,可以更准确地评估函数的平均执行时间,提升开发效率。
106 61
Python装饰器实战:打造高效性能计时工具
|
1月前
|
数据采集 供应链 API
Python爬虫与1688图片搜索API接口:深度解析与显著收益
在电子商务领域,数据是驱动业务决策的核心。阿里巴巴旗下的1688平台作为全球领先的B2B市场,提供了丰富的API接口,特别是图片搜索API(`item_search_img`),允许开发者通过上传图片搜索相似商品。本文介绍如何结合Python爬虫技术高效利用该接口,提升搜索效率和用户体验,助力企业实现自动化商品搜索、库存管理优化、竞品监控与定价策略调整等,显著提高运营效率和市场竞争力。
89 3
|
2月前
|
Python
课程设计项目之基于Python实现围棋游戏代码
游戏进去默认为九路玩法,当然也可以选择十三路或是十九路玩法 使用pycharam打开项目,pip安装模块并引用,然后运行即可, 代码每行都有详细的注释,可以做课程设计或者毕业设计项目参考
78 33
|
2月前
|
数据采集 存储 XML
python实战——使用代理IP批量获取手机类电商数据
本文介绍了如何使用代理IP批量获取华为荣耀Magic7 Pro手机在电商网站的商品数据,包括名称、价格、销量和用户评价等。通过Python实现自动化采集,并存储到本地文件中。使用青果网络的代理IP服务,可以提高数据采集的安全性和效率,确保数据的多样性和准确性。文中详细描述了准备工作、API鉴权、代理授权及获取接口的过程,并提供了代码示例,帮助读者快速上手。手机数据来源为京东(item.jd.com),代理IP资源来自青果网络(qg.net)。
|
2月前
|
JavaScript API C#
【Azure Developer】Python代码调用Graph API将外部用户添加到组,结果无效,也无错误信息
根据Graph API文档,在单个请求中将多个成员添加到组时,Python代码示例中的`members@odata.bind`被错误写为`members@odata_bind`,导致用户未成功添加。
52 10

推荐镜像

更多