python爬虫 - 初识正则表达式

news2024/10/11 16:39:32

  🌈个人主页: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())   # 输出: 3
    print(match.end())     # 输出: 6
    print(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 模块提供了丰富的正则表达式处理功能,使开发者能够高效地完成复杂的字符串操作任务。从基础的字符匹配到高级的模式匹配,本文通过多种示例展示了如何应用正则表达式处理不同类型的文本任务。掌握这些技巧后,开发者将能轻松应对各种文本处理需求,并在实际工作中有效提升代码的灵活性和性能。

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

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

相关文章

DAY7 继承多态

继承 目的 提高代码的重用性,减少一些重复代码的书写 权限修饰符 就是是用来限制类中的成员(成员变量、成员方法、构造器)能够被访问的范围。 private 只能本类 缺省 本类、同一个包中的类 protected 本类,同一个包中的类、子…

thenable的执行时机

thenable执行只有2个时机 1.触发resolve()时,代码尚未注册then的内容,那么直到代码扫描到then那一行,才会把then的内容放进队列 2.先注册then,直到后期遇到resolve(),才会进入队列 视频教学 https://www.bilibili.com/video/BV12zsqeMEyt

传智杯 第六届—C

题目描述: 输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如:第一个字符串是"They are students.",第二个字符串是”aeiou"。删除之后的第一个字符串变成"Thy r stdnts."。保证两个字符…

仿生水凝胶微纤维:从蜘蛛丝获得灵感,探索高性能纤维材料的新路径

大家好!今天咱们来了解一种水凝胶微纤维——《Bioinspired Mechanically Robust and Recyclable Hydrogel Microfibers Based on Hydrogen‐Bond Nanoclusters》发表于《Advanced Science》。研究人员从蜘蛛丝那儿获得灵感,想要做出既机械性能好&#xf…

Spring Cloud 配置中心详解:微服务动态读取与案例示范

在微服务架构中,每个微服务往往都有其独立的配置,这些配置可能会根据环境的不同(开发、测试、生产)进行调整和变化。Spring Cloud 配置中心提供了一种集中化管理和动态更新微服务配置的解决方案。在本文中,我们将详细介…

详细分析Spring Framework中 @ConditionalOnProperty的基本知识(附Demo)

目录 前言1. 基本知识2. Demo 前言 基本的Java知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新) 从实战中学习启发 1. 基本知识 Conditiona…

一键将表格嵌入ppt作为附件!2个做ppt必知的技巧分享!

怎样把表格作为附件放入ppt? 众所周知,微软推出的Office套件包含了Powerpoint和Excel这两款软件,如果想在Powerpoint中插入表格,且表格数据量比较大,此时最好的呈现方式,是在Excel中来展示这些数据&#x…

msvcp120.dll无法继续执行代码的五个解决方法

在计算机系统中,MSVCP120.dll是一个至关重要的动态链接库文件,它是Microsoft Visual C Redistributable Package的一部分,对于许多基于Windows的应用程序运行至关重要。当系统提示“msvcp120dll丢失”时,意味着该文件可能由于误删…

清华毕业生去向引发的思考....

近日,清华最新发布的毕业生去向一经公布,便在社会上引起了广泛的关注和热议,许多人看完后都陷入了沉默。这一份去向报告,不仅仅是一组数据的呈现,更是对教育成果、社会需求以及个人发展等多方面问题的深刻映射。 一、数…

文件与目录的基本操作

前提:使用su root 切换到权限最大的root用户 1.显示当前工作目录的绝对路径(pwd) 用途:用于显示当前工作目录的绝对路径的命令。无论用户在文件系统的哪个位置,pwd 命令都能提供当前所在位置的完整路径信息。 用法&a…

现货白银交易技巧:向下突破回撤策略

有关现货白银交易的技巧一直是投资者关注的重点,投资者确实应该保持学习,这样才能跟得上市场,不会落后,下面我们就来介绍一个现货白银交易中的突破回撤的策略。 首先这个现货白银交易技巧判断的基础就是找到一波横盘趋势。所谓的突…

【C# 网络编程】基本概念

基本概念 OSI模型 背景: 为了统一和兼容不同计算机厂商的网络体系结构概念,国际标准化组织(ISO)在1979年提出了OSI参考模型(Open System Interconnection,) 结构 物理层(Physica…

java反序列化之CommonCollections6利⽤链的学习

一、源起 前文学习CC1链和URLDNS链的学习,同时学习过程中知道cc1受jdk版本的限制,故而进一步分析cc6链的利用过程,这个利用链不受jdk版本的限制,只要commons collections小于等于3.2.1,都存在这个漏洞。 ps&#xff1…

Flink 介绍(特性、概念、故障容错、运维部署、应用场景)

概述 特性 概念 数据流 状态 时间 savepoint 故障容错 运维部署 部署应用到任意地方 Flink能够更方便地升级、迁移、暂停、恢复应用服务 监控和控制应用服务 运行任意规模应用 应用场景 事件驱动型应用 什么是事件驱动型应用? 事件驱动型应用的优势 Flink如何…

对接外卖霸王餐api要遵循哪些步骤?

对接外卖霸王餐API接口的步骤通常包括以下几个关键环节: 选择服务提供商:根据需求、预算、服务内容、接口稳定性、覆盖范围(是否支持全国多个城市、是否支持主要外卖平台如美团和饿了么等)、技术支持等因素选择合适的霸王餐API服…

实现一个时钟

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QPainter>//画家类 #include<QTime>//时间类 #include<QTimer>//定时器类QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget …

vue3.5系列之响应式props解构的几点技巧对比

在最新的版本3.5x中&#xff0c;对props的能力也进行了加强。下面&#xff0c;我们具体看下有哪些变化&#xff0c;给我们带来的新的体验&#xff01; 体验一 3.5之前解构props的效果 // 子组件 <template><div><h1>响应式props</h1><p>{{ co…

【储能优化】使用优化的微电网能源管理系统 (EMS)

摘要 本文介绍了一种基于优化的微电网能源管理系统&#xff08;EMS&#xff09;&#xff0c;通过储能优化实现电网、光伏发电、以及储能设备之间的智能调度。系统旨在降低能源成本、减少碳排放&#xff0c;并提高能源利用效率。利用该EMS系统&#xff0c;电网用户能够在满足负…

使用docker、编写dockerfile、httpd镜像,并启动镜像,创建httpd主页和分页。(2)

1.准备一台机子&#xff0c;准备源&#xff0c;下载docker-ce vi /etc/yum.repo.d/Centos-7.repo 加入以下内容[base] nameCentOS-$releasever - Base - mirrors.aliyun.com failovermethodpriority baseurlhttp://mirrors.aliyun.com/centos/$releasever/os/$basearch/http:/…

Midjourney中文版:创意无限,艺术之旅由此启程

Midjourney中文版——一个将你的文字想象转化为视觉艺术的神奇平台。无需繁琐的绘画技巧&#xff0c;只需简单的文字描述&#xff0c;你就能开启一场前所未有的艺术之旅。 Midjourney AI超强绘画 (原生态系统&#xff09;用户端&#xff1a;Ai Loadinghttps://www.mjdiscord.c…