Python如何使用正则表达式提取网页中的特定信息?

news2024/10/28 23:16:37

1.正则表达式基础语法

字符匹配:
普通字符:大多数字符(如字母、数字、标点符号)会匹配它们自身。例如,正则表达式abc会匹配字符串中的abc这三个连续的字符。
特殊字符:有些字符在正则表达式中有特殊含义,如^(表示匹配行的开头)、$(表示匹配行的结尾)、.(匹配除换行符外的任意一个字符)、*(匹配前面的字符零次或多次)、+(匹配前面的字符一次或多次)、?(匹配前面的字符零次或一次)。例如,a.*b会匹配以a开头、b结尾的字符串,中间可以有任意多个(包括零个)字符。
字符类:
方括号[]用于定义字符类,匹配其中的任意一个字符。例如,[abc]会匹配a、b或者c中的任意一个。也可以使用范围表示,如[a - z]会匹配任意一个小写字母。
分组:
括号()用于分组。例如,(ab)+会匹配ab这个组合一次或多次出现的情况,如ab、abab等。分组还可以用于在匹配后提取特定的部分,这在提取网页信息时非常有用。

2.在 Python 中使用正则表达式提取网页信息的步骤

导入模块:在 Python 中,需要导入re模块来使用正则表达式。例如,import re。
获取网页内容:首先要有网页的内容,可以通过发送 HTTP 请求(如使用urllib或requests库)来获取网页源代码。假设已经获取到网页内容并存储在变量html_content中。
编写正则表达式模式:根据要提取的特定信息编写正则表达式。例如,如果要提取网页中的所有电子邮件地址,电子邮件地址的一般格式是用户名@域名,可以编写如下正则表达式模式:[a - zA - Z0 - 9_.±]+@[a - zA - Z0 - 9 -]+.[a - zA - Z0 - 9 -]+。
进行匹配和提取:使用re模块中的函数来进行匹配和提取。
re.findall () 函数:用于在字符串中找到所有匹配给定正则表达式的子串,并返回一个列表。例如,email_addresses = re.findall(‘[a - zA - Z0 - 9_.±]+@[a - zA - Z0 - 9 -]+.[a - zA - Z0 - 9 -]+’, html_content),这样就可以得到网页中所有电子邮件地址的列表。
re.search () 函数:在字符串中查找匹配正则表达式的第一个位置,并返回一个匹配对象。如果要提取匹配的内容,可以通过匹配对象的group()方法。例如,match = re.search(‘(.<em>?)</em>', html_content),如果找到匹配的标签,match.group(1)就可以提取<title>标签内的标题内容。这里的(.?)是一个分组,?表示非贪婪匹配,即尽可能少地匹配字符,以确保只提取<title>标签内的内容。<br/> re.finditer () 函数:和re.findall()类似,但返回的是一个迭代器,每次迭代返回一个匹配对象。这种方式在处理大量匹配结果时比较节省内存。例如,for match in re.finditer(’[a - zA - Z0 - 9_.±]+@[a - zA - Z0 - 9 -]+.[a - zA - Z0 - 9 -]+', html_content): print(match.group()),可以逐个打印出网页中的电子邮件地址。

3.示例:提取网页中的电话号码

假设网页内容中有电话号码,格式为(xxx) xxx - xxxx。
正则表达式模式可以写为(\d{3}) \d{3}-\d{4}。
代码如下:

     import re
     html_content = "<p>联系电话:(123) 456 - 7890</p>"
     phone_numbers = re.findall('\(\d{3}\)\s*\d{3}\s*-\s*\d{4}', html_content)
     print(phone_numbers)

运行结果:[‘(123) 456 - 7890’]

4.注意事项

网页内容的复杂性:网页内容可能很复杂,存在多种格式和编码。例如,HTML 标签可能嵌套,内容可能包含特殊字符。在编写正则表达式时,需要考虑这些因素,可能需要对正则表达式进行调整。
贪婪匹配与非贪婪匹配:在使用*、+等量词时,默认是贪婪匹配,即会尽可能多地匹配字符。如a.b会匹配从第一个a到最后一个b之间的所有字符。如果要实现非贪婪匹配,需要在量词后加上?,如a.?b,这样会匹配最短的符合条件的字符串。
验证正则表达式:可以使用一些在线正则表达式测试工具(如regex101.com)来验证和调试正则表达式,确保其能够正确地匹配和提取想要的信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2225767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新手入门c++(8)

到时候了&#xff0c;是时候给你们讲一下其他的定义形式与格式化输入输出了。 1.长整型变量 长整型变量分为两种&#xff1a; ①long类型 在计算机编程中&#xff0c;long 类型是一个整型数据类型&#xff0c;用于存储较大的整数。它的大小和范围取决于操作系统和编译器的实…

存储引用服务(OSS)Minio 环境搭建

下载Docker desktop 最好进行相关的设置&#xff0c;比如说进行登陆docker账号等等 推荐使用 docker-engine源【目前还能使用下载】 https://ccr.ccs.tencentyun.com 使用docker拉取对应的minio镜像 netstat -aon|findstr "8081" 注意&#xff1a;dockerhub有时…

QT访问数据库:应用提示Driver not loaded

在QT中运行完全正确错误截图 解决办法 我用的是MySQL。我把libmysql.dll复制到应用程序的目录下&#xff0c;即可正常访问数据库。

Hugging Face 使用指南——并行智算云(10s上手版)

1. 在bash中使用 1.1 直接复制命令 echo export HF_ENDPOINT"https://hf-mirror.com" >> ~/.bashrc # 在bashrc文件中设置镜像地址 source ~/.bashrc # 使修改立即生效 echo $HF_ENDPOINT # 查看是否成功红框部分出现就是正确了 1.2 命令详解 命令行echo…

HarmonyOS开发 - 本地持久化之实现LocalStorage支持多实例

用户首选项为应用提供Key-Value键值型的数据处理能力&#xff0c;支持应用持久化轻量级数据&#xff0c;并对其修改和查询。数据存储形式为键值对&#xff0c;键的类型为字符串型&#xff0c;值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型。 在上一篇中&…

CodeQL学习笔记(1)-QL语法(逻辑连接词、量词、聚合词、谓词和类)

最近在学习CodeQL&#xff0c;对于CodeQL就不介绍了&#xff0c;目前网上一搜一大把。本系列是学习CodeQL的个人学习笔记&#xff0c;根据个人知识库笔记修改整理而来的&#xff0c;分享出来共同学习。个人觉得QL的语法比较反人类&#xff0c;至少与目前主流的这些OOP语言相比&…

计算机视觉专栏(2)【LeNet】代码实战【pytorch】完整可运行

LeNet 系列 实践部分1.引言2. limu代码3. plpal代码3.1 代码调试3.2 代码详解 4. 总结 实践部分 Lenet的实现分为两种代码&#xff0c;一种是李沐老师的实现代码以及b友up霹雳啪啦的代码&#xff0c;两者都有不同的优点&#xff0c;李老师的lenet十分还原原著中的操作&#xf…

ios 项目升级极光SDK

由于项目使用的是旧版本&#xff0c;隐私合规检查不通过&#xff0c;需要升级到最新版本&#xff0c; 使用cocoapods集成无法正常运行&#xff0c;.a文件找不到&#xff0c;可能项目比较久了&#xff0c;最好选择手动导入 下载最新版本SDK&#xff0c;将 SDK 包解压&#xff…

IROS 2024最新接收的Motion Planning前沿研究成果汇总

No.1 文章标题&#xff1a;Extended Tree Search for Robot Task and Motion Planning 作者&#xff1a;REN, Tianyu; Chalvatzaki, Georgia; Peters, Jan 中文标题&#xff1a;机器人任务和运动规划的扩展树搜索 No.2 文章标题&#xff1a;Kinodynamic Motion Planning fo…

Jmeter分布式性能测试细节+常见问题解决

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Jmeter分布式测试时需要的特别注意 1&#xff09;参数化文件的位置和内容 如果使用csv文件进行参数化&#xff0c;即通过读取csv文件中的数据来为测试脚本提供…

C/C++每日一练:实现选择排序

选择排序 选择排序是一种简单直观的排序算法&#xff0c;时间复杂度为&#xff0c;其中 n 是数组长度&#xff0c;不适合大数据集的排序&#xff0c;适合于元素较少且对性能要求不高的场景。 选择排序的基本思想是&#xff1a;每次从未排序部分选择最小的元素&#xff0c;将其放…

[四轴飞行器] 遥控器操作说明

遥控器操作说明 1 A&#xff1a;无线连接信号强度&#xff1a;已连接 B&#xff1a;控制模式&#xff1a;H定高模式,T定点模式 C&#xff1a;遥控器状态&#xff1a;加锁 D&#xff1a;飞行模式&#xff1a;无头 E&#xff1a;电量显示&#xff1a;遥控器电量&#xff08;加…

OpenCV系列教程六:信用卡数字识别、人脸检测、车牌/答题卡识别、OCR

文章目录 一、信用卡数字识别1.1 模板匹配1.2 匹配多个对象1.3 处理数字模板1.4 预处理卡片信息&#xff0c;得到4组数字块。1.5 遍历数字块&#xff0c;将卡片中每个数字与模板数字进行匹配 二、人脸检测2.1人脸检测算法原理2.2 OpenCV中的人脸检测流程 三、车牌识别3.1 安装t…

Jupyter Notebook 中使用render_notebook渲染pyecharts图像不显示的一种情况

一开始我发现自己的jupyter文件在渲染pyecharts图片时一开始可以显示&#xff0c;但后来不知道怎么的就不显示了&#xff0c;查找了很多方法&#xff0c;但是没有效果&#xff0c;都是改js渲染什么的&#xff0c;还有就是参数不对的&#xff0c;对于我来说都没什么用&#xff0…

Pytorch学习--DataLoader的使用

一、DataLoader简介 DataLoader官网 重要参数&#xff1a;画红框的参数 dataset: 作用&#xff1a;表示要加载的数据集。DataLoader通过该参数从数据集中读取数据。类型&#xff1a;Dataset&#xff0c;即PyTorch定义的Dataset类&#xff0c;用于封装数据并提供数据索引的功…

C++第八讲:STL--stack和queue的使用及模拟实现

C第八讲&#xff1a;STL--stack和queue的使用及模拟实现 1.stack的使用2.queue的使用3.栈和队列OJ题3.1题目1&#xff1a;最小栈3.2题目2&#xff1a;栈的压入、弹出序列3.3题目3&#xff1a;逆波兰表达式求值3.4题目4&#xff1a;用栈实现队列 4.栈的模拟实现5.队列的模拟实现…

BFS解决最短路问题(4)_为高尔夫比赛砍树

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 BFS解决最短路问题(4)_为高尔夫比赛砍树 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48…

LeetCode-684. 冗余连接

. - 力扣&#xff08;LeetCode&#xff09; 题目 树可以看成是一个连通且 无环 的 无向 图。 给定往一棵 n 个节点 (节点值 1&#xff5e;n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间&#xff0c;且这条附加的边不属于树中已存在的边。图的信息记录于…

传输层UDP

再谈端口号 端口号&#xff1a;标识了主机上进行通信的不同的应用程序 在TCP/IP 协议中我们用“源IP”"源端口号" “目的IP”“目的端口号” “协议号”五元组来标识一个通信 用netstat -n 查看 查看网络信息&#xff0c;我们有两种命令查看网络通信1.用netsta…

Python | Leetcode Python题解之第509题斐波那契数

题目&#xff1a; 题解&#xff1a; class Solution:def fib(self, n: int) -> int:if n < 2:return nq [[1, 1], [1, 0]]res self.matrix_pow(q, n - 1)return res[0][0]def matrix_pow(self, a: List[List[int]], n: int) -> List[List[int]]:ret [[1, 0], [0, …