当前位置: 首页 > news >正文

【Python爬虫实战】正则:从基础字符匹配到复杂文本处理的全面指南

  🌈个人主页:https://blog.csdn.net/2401_86688088?type=blog
🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html

目录

前言

一、正则表达式

(一)正则表达式的基本作用

(二)正则表达式的基本组成

(三)常用的正则表达式示例

(四)正则表达式的应用场景

二、re模块的介绍

(一)re 模块中的常用函数

(二)re 模块中的标志位

(三)Match 对象

(四)示例

(五)总结

三、正则匹配单个字符

(一)匹配任意单个字符

(二)匹配特定字符

(三)匹配特定字符集中的任意字符

(四)匹配数字字符

(五)匹配字母字符

(六)匹配空白字符

(七)匹配指定范围的字符

(八)匹配非某个字符

(九)总结

四、总结


前言

正则表达式作为一种强大的文本处理工具,广泛应用于编程、文本编辑和数据处理等领域。通过定义一系列字符和符号的组合,正则表达式能够快速识别、搜索、替换和操作文本中的特定模式,极大地提高了文本处理的效率。在 Python 中,re 模块提供了对正则表达式的支持,使得开发者能够轻松处理字符串中的复杂匹配问题。本篇文章将详细介绍正则表达式的基本作用、常用符号及其在 Python re 模块中的应用,帮助读者掌握如何利用正则表达式进行高效的文本处理。


一、正则表达式

正则表达式是一种用于匹配字符串的模式或模板,通过定义特定的规则来搜索、匹配、替换和操作文本中的字符或字符串。正则表达式是一种文本处理工具,广泛应用于编程、文本编辑器、数据处理和信息提取等场景。

(一)正则表达式的基本作用

正则表达式是一种灵活的模式匹配工具,主要用于查找、替换、验证和分割字符串。以下是正则表达式的主要用途:

  1. 查找字符串:在一段文本中查找特定的字符组合。

  2. 验证输入:检查输入是否符合特定格式,比如电子邮件地址、电话号码等。

  3. 替换字符串:用新的字符串替换文本中符合条件的部分。

  4. 提取信息:从文本中提取特定格式的信息,比如日期、数字或特定标记。

(二)正则表达式的基本组成

正则表达式由一系列字符、特殊符号和操作符组成,用于匹配特定的文本模式。常用的正则表达式符号包括:

  • 普通字符:字母、数字等普通字符在正则中表示匹配它们本身。例如,a 匹配字母 a

  • 特殊字符:正则表达式中的某些字符具有特殊含义,需要通过转义符号 \ 来表示匹配其本身。例如,. 匹配任意单个字符,但 \. 匹配点号本身。

  • 字符类:用方括号 [] 表示的字符集合,匹配其中的任意一个字符。例如,[abc] 匹配 abc

  • 量词:指定匹配字符的次数。例如,* 匹配前面的字符0次或多次,+ 匹配1次或多次,? 匹配0次或1次,{n} 精确匹配n次。

  • 边界符

    • ^:表示字符串的开始。

    • $:表示字符串的结尾。

  • 转义字符:用反斜杠 \ 来表示特殊含义。例如,\d 匹配任意数字,\w 匹配字母或数字,\s 匹配空白字符。

(三)常用的正则表达式示例

  • 匹配数字\d+ 匹配一个或多个数字。

  • 匹配邮箱地址[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+

  • 匹配日期格式(YYYY-MM-DD)\d{4}-\d{2}-\d{2}

  • 匹配网址https?://[a-zA-Z0-9./?=&-_]+

(四)正则表达式的应用场景

  • 表单验证:正则表达式经常用于验证用户输入的格式,比如邮箱、密码、电话号码等。

  • 数据提取:在网络爬虫中,用于从网页中提取特定的信息,如链接、文章标题等。

  • 文本搜索和替换:正则表达式能高效地搜索和替换大量文本中的某些模式。二、


二、re模块的介绍

re 模块是 Python 内置的正则表达式模块,提供了使用正则表达式处理字符串的功能。通过 re 模块,用户可以执行正则表达式的匹配、搜索、替换等操作,方便处理文本和字符串中的复杂模式。

(一)re 模块中的常用函数

1.re.match()

作用:尝试从字符串的起始位置匹配正则表达式。如果匹配成功,则返回一个 Match 对象,否则返回 None

用法

re.match(pattern, string, flags=0)

示例

import re
result = re.match(r'\d+', '123abc')
print(result.group())  # 输出: '123'

2.re.search()

作用:扫描整个字符串,寻找第一个与正则表达式相匹配的内容。如果找到则返回 Match 对象,否则返回 None

用法

re.search(pattern, string, flags=0)

示例

result = re.search(r'\d+', 'abc123')
print(result.group())  # 输出: '123'

3.re.findall()

作用:查找字符串中所有与正则表达式匹配的内容,并以列表形式返回所有匹配的结果。

用法

re.findall(pattern, string, flags=0)

示例

result = re.findall(r'\d+', 'abc123def456')
print(result)  # 输出: ['123', '456']

4.re.finditer()

作用:返回一个迭代器,包含字符串中所有匹配的内容,每个匹配都是一个 Match 对象。

用法

re.finditer(pattern, string, flags=0)

示例

for match in re.finditer(r'\d+', 'abc123def456'):print(match.group())  # 输出: '123', '456'

5.re.sub()

作用:用于替换字符串中所有匹配正则表达式的内容。

用法

re.sub(pattern, repl, string, count=0, flags=0)

参数详解

  • pattern:正则表达式。

  • repl:替换为的字符串。

  • string:要处理的字符串。

  • count:指定最多替换的次数,默认替换所有匹配项。

示例

result = re.sub(r'\d+', 'X', 'abc123def456')
print(result)  # 输出: 'abcXdefX'

6.re.split()

作用:根据匹配的正则表达式分割字符串,返回一个列表。

用法

re.split(pattern, string, maxsplit=0, flags=0)

示例

result = re.split(r'\d+', 'abc123def456')
print(result)  # 输出: ['abc', 'def', '']

7.re.compile()

作用:编译正则表达式模式,返回一个正则表达式对象,以提高匹配效率,特别是在多次使用相同正则表达式时。

用法

re.compile(pattern, flags=0)

示例

pattern = re.compile(r'\d+')
result = pattern.findall('abc123def456')
print(result)  # 输出: ['123', '456']

(二)re 模块中的标志位

在使用 re 模块时,可以通过 flags 改变正则表达式的匹配行为,常用的标志位包括:

1.re.IGNORECASEre.I:忽略大小写匹配。

result = re.search(r'abc', 'ABC', re.I)
print(result.group())  # 输出: 'ABC'

2.re.MULTILINEre.M:多行模式。使得 ^$ 匹配每一行的开始和结束,而不仅仅是整个字符串的开始和结束。

text = """First line
Second line"""
result = re.findall(r'^\w+', text, re.M)
print(result)  # 输出: ['First', 'Second']

3.re.DOTALLre.S:使 . 匹配所有字符,包括换行符。

result = re.search(r'.+', 'abc\ndef', re.S)
print(result.group())  # 输出: 'abc\ndef'

4.re.VERBOSEre.X:允许你编写易读的正则表达式,可以在表达式中加入注释和换行。

pattern = re.compile(r"""\d+  # 匹配数字\s*  # 匹配空格\w+  # 匹配字母或数字""", re.X)
result = pattern.findall('123 abc')
print(result)  # 输出: ['123 abc']

(三)Match 对象

re.match()re.search() 返回的 Match 对象包含匹配的详细信息。常用方法有:

  1. group():返回匹配的字符串。

  2. start():返回匹配字符串的起始位置。

  3. end():返回匹配字符串的结束位置。

  4. span():返回一个元组,表示匹配字符串的起始和结束位置。

示例:

match = re.search(r'\d+', 'abc123')
if match:print(match.group())   # 输出: '123'print(match.start())   # 输出: 3print(match.end())     # 输出: 6print(match.span())    # 输出: (3, 6)

(四)示例

以下是一个综合示例,展示如何使用正则表达式进行匹配和替换:

import re# 匹配电话号码
text = "我的电话号码是:123-4567-8901"
phone_pattern = r'\d{3}-\d{4}-\d{4}'
phone_match = re.search(phone_pattern, text)
if phone_match:print(f"找到的电话号码: {phone_match.group()}")  # 输出: 123-4567-8901# 替换敏感信息
masked_text = re.sub(r'\d{3}-\d{4}-\d{4}', '***-****-****', text)
print(masked_text)  # 输出: 我的电话号码是:***-****-****

(五)re模块总结

Python 的 re 模块为处理正则表达式提供了丰富的功能,适用于复杂的字符串处理任务。通过学习常用函数和标志位,掌握正则表达式的使用技巧,可以极大提高文本处理的效率。


三、正则匹配单个字符

正则表达式中,匹配单个字符的方式有很多,具体取决于你要匹配的字符类型。下面介绍几种常见的匹配单个字符的方式:

(一)匹配任意单个字符

使用 . 来匹配任意的单个字符(除了换行符)。

示例:

import re
text = "abc"
result = re.findall(r'.', text)
print(result)  # 输出: ['a', 'b', 'c']

(二)匹配特定字符

如果要匹配特定的单个字符,可以直接写出字符。例如,匹配字母 a

示例:

import re
text = "abc"
result = re.findall(r'a', text)
print(result)  # 输出: ['a']

(三)匹配特定字符集中的任意字符

使用方括号 [] 匹配字符集中任意一个字符。例如,匹配 a, b, c 这三个字符。

示例:

import re
text = "abc"
result = re.findall(r'[abc]', text)
print(result)  # 输出: ['a', 'b', 'c']

(四)匹配数字字符

使用 \d 来匹配单个数字字符(0-9)。

示例:

import re
text = "123abc"
result = re.findall(r'\d', text)
print(result)  # 输出: ['1', '2', '3']

(五)匹配字母字符

使用 \w 来匹配单个字母、数字或下划线([a-zA-Z0-9_])。

示例:

import re
text = "a1_b2"
result = re.findall(r'\w', text)
print(result)  # 输出: ['a', '1', '_', 'b', '2']

(六)匹配空白字符

使用 \s 匹配单个空白字符(如空格、制表符、换行符)。

示例:

import re
text = "a b c"
result = re.findall(r'\s', text)
print(result)  # 输出: [' ', ' ']

(七)匹配指定范围的字符

使用方括号结合字符范围表示法。例如,匹配小写字母(a-z)。

示例:

import re
text = "abcXYZ"
result = re.findall(r'[a-z]', text)
print(result)  # 输出: ['a', 'b', 'c']

(八)匹配非某个字符

使用 [^] 进行反向匹配,匹配不在指定集合中的任意字符。例如,匹配非数字字符。

示例:

import re
text = "123abc"
result = re.findall(r'[^0-9]', text)
print(result)  # 输出: ['a', 'b', 'c']

(九)匹配单个字符总结

根据需要匹配的字符类型,正则表达式提供了不同的方式来匹配单个字符。你可以使用直接字符匹配、字符集、预定义字符集(如 \d\w\s)等方式实现灵活的匹配。


四、总结

正则表达式是文本处理领域中的一项重要技术,能够根据模式对字符串进行匹配、搜索、替换和分割等操作。Python 的 re 模块提供了丰富的正则表达式处理功能,使开发者能够高效地完成复杂的字符串操作任务。从基础的字符匹配到高级的模式匹配,本文通过多种示例展示了如何应用正则表达式处理不同类型的文本任务。掌握这些技巧后,开发者将能轻松应对各种文本处理需求,并在实际工作中有效提升代码的灵活性和性能。

相关文章:

【Python爬虫实战】正则:从基础字符匹配到复杂文本处理的全面指南

🌈个人主页:https://blog.csdn.net/2401_86688088?typeblog 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、正则表达式 (一)正则表达式的基本作用 &#xf…...

10.18Python基础迭代器生成器_函数式编程

Python迭代器与生成器 1. 迭代器 Iterator 什么是迭代器 迭代器是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器可以重复使用,而不会像列表那样在迭代时被修改。 迭代器函数iter和next 函数说明iter(iterable)从可迭代对象中返回一个迭…...

HttpPost 类(构建 HTTP POST 请求)

HttpPost 类是 Apache HttpClient 库中的一个类,用于构建 HTTP POST 请求。以下是 HttpPost 类的一些常用方法和代码案例: 常用方法 构造方法: HttpPost(String uri):创建一个 HttpPost 对象,并将请求的 URI 作为参数…...

xtu oj 原根

文章目录 回顾杂思路c 语言代码 回顾 AB III问题 H: 三角数问题 G: 3个数等式 数组下标查询,降低时间复杂度1405 问题 E: 世界杯xtu 数码串xtu oj 神经网络xtu oj 1167 逆序数(大数据) 杂 有一些题可能是往年的程设的题,现在搬到…...

Java Spring 中常用的 @PostConstruct 注解使用总结

引言 在最近的学习中,我发现了一个非常实用的注解 —— PostConstruct。通过深入学习,逐步发现这个注解在实际开发中可以帮助我们更轻松地解决不少原本复杂的问题,特别是在项目启动时自动执行一些必要的初始化操作。相比于手动调用&#xff…...

Visual Studio--VS安装配置使用教程

Visual Studio Visual Studio 是一款功能强大的开发人员工具,可用于在一个位置完成整个开发周期。 它是一种全面的集成开发环境 (IDE)。对新手特别友好,使用方便,不需要复杂的去配置环境。用它学习很方便。 Studio安装教程 Visual Studio官…...

什么叫CMS?如何使用CMS来制作网站?

CMS是什么? 内容管理系统(Content Management System,CMS),是一种位于WEB前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人…...

如何获取谷歌浏览器窗口句柄并将其设置为Qt的父窗口

1、首先,确保你在项目的 .pro 文件中加入对WinAPI的支持: win32: LIBS -luser322、步骤概述: 使用WinAPI获取谷歌浏览器窗口的句柄。获取Qt窗口的句柄。使用SetParent函数,将Qt窗口设置为谷歌浏览器窗口的子窗口。调整Qt窗口的…...

牛客小白月赛102:最短?路径(分层bfs)

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 给定一个 nnn 个点 mmm 条边的无向图,LH 打算从点 111 出发去点 nnn。 假如 LH 到达了一个点 iii,那么他可以选择在这个点花费 aia_iai​ 的时间休息后继续赶…...

JSON字符串转成java的Map对象

要将这个JSON字符串转换成Java对象,你可以定义一个Element类来表示每个要素,然后使用一个Map来存储这些要素。以下是具体的实现步骤: 步骤 1: 定义 Element 类 首先,定义一个Element类来表示每个要素的结构: public…...

重读《人月神话》(8)-为什么巴比伦塔会失败?(Why Did the Tower of Babel Fail?)

据《创世纪》记载,巴比伦塔是人类继诺亚方舟之后的第二大工程壮举,但巴比伦塔同时也是第一个彻底失败的工程。 巴比伦塔的管理教训 这个项目具备了几乎所有成功的先决条件: 有清晰的目标,尽管目标理想化到了近乎不可实现的地步&…...

STL源码剖析:Hashtable

hashtable 概述 哈希表是一种数据结构,它提供了快速的数据插入、删除和查找功能。它通过使用哈希函数将键(key)映射到表中的一个位置来实现这一点,这个位置称为哈希值或索引。哈希表使得这些操作的平均时间复杂度为常数时间&…...

spring-boot学习(2)

上次学习截止到拦截器 1.构建RESfun服务 PathVariable通过url路径获取url传递过来的信息 2.MyBatisPlus 第三行的mydb要改为自己的数据库名 第四,五行的账号密码改成自己的 MaooerScan告诉项目自己的这个MyBatisPlus是使用在哪里的,包名 实体类的定义…...

《案例》—— OpenCV 实现2B铅笔填涂的答题卡答案识别

文章目录 一、案例介绍二、代码解析 一、案例介绍 下面是一张使用2B铅笔填涂选项后的答题卡 使用OpenCV 中的各种方法进行真确答案识别,最终将正确填涂的答案用绿色圈出,错误的答案不圈出,用红色圈出错误题目的正确答案最终统计正确的题目数…...

新员工入职流程指南_完整入职流程解析

文章介绍了新员工入职流程的重要性、步骤及持续时间,并推荐ZohoPeople软件自动化管理入职流程,提升新员工入职体验,减少离职率,确保合规性,提升公司品牌形象。 一、新员工入职流程是怎样的? 入职流程是指一…...

mysql查看和修改默认配置

1.查看最大连接数 SELECT max_connections; 或者 SHOW VARIABLES LIKE max_connections;2.查看当前连接的客户端 SHOW PROCESSLIST;2.临时设置最大连接数 SET GLOBAL max_connections 500;3.临时设置连接客户端交互超时时间 SET GLOBAL interactive_timeout 1800;4.永久生…...

海外云手机:出海电商养号智能化方案

随着出海电商的迅猛发展,使用海外云手机进行养号已经成为越来越多商家的新选择。尤其在社交电商推广和短视频引流方面,海外云手机不仅提高了流量的精准度,还助力商家实现业务的快速增长。本文将探讨海外云手机养号相较于传统模式的优势&#…...

OpenAI Canvas用户反馈:并不如外界传言般“炸裂”,更不是“AGI的终极交互形态” | LeetTalk Daily...

“LeetTalk Daily”,每日科技前沿,由LeetTools AI精心筛选,为您带来最新鲜、最具洞察力的科技新闻。 Canvas作为一个独立的界面,通过与ChatGPT的结合来提升用户的协作能力和创作效率。尽管用户对其独立性与现有工具的整合存在不同…...

RiproV9.0主题wordpress主题免扩展可二开PJ版/WordPress博客主题Ripro全解密无后门版本

🔥🎉 全新RiPro9.0开源版发布 —— 探索无限可能🚀🌐 今天,我很高兴能与大家分享一个重磅资源——RiPro9.0开源版!这不是一个普通的版本,而是一个经过精心打磨、全面解密的力作。🔍…...

[LeetCode] 515. 在每个树行中找最大值

题目描述: 给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。 示例1: 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9]示例2: 输入: root [1,2,3] 输出: [1,3]提示: 二叉树的节点个数的范围是 [0,10…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]

报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...

医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor

1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...

ABB馈线保护 REJ601 BD446NN1XG

配电网基本量程数字继电器 REJ601是一种专用馈线保护继电器,用于保护一次和二次配电网络中的公用事业和工业电力系统。该继电器在一个单元中提供了保护和监控功能的优化组合,具有同类产品中最佳的性能和可用性。 REJ601是一种专用馈线保护继电器&#xf…...

Modbus转ETHERNET IP网关:快速冷却系统的智能化升级密钥

现代工业自动化系统中,无锡耐特森Modbus转Ethernet IP网关MCN-EN3001扮演着至关重要的角色。通过这一技术,传统的串行通讯协议Modbus得以在更高速、更稳定的以太网环境中运行,为快速冷却系统等关键设施的自动化控制提供了强有力的支撑。快速冷…...