Python 正则表达式使用指南

Python 正则表达式使用指南

正则表达式(Regular Expression, 简称 regex)是处理字符串和文本的强大工具。它使用特定的语法定义一组规则,通过这些规则可以对文本进行匹配、查找、替换等操作。Python 提供了 re 模块,使得正则表达式的功能易于使用。本文将详细介绍 Python 中如何使用正则表达式,并通过代码示例帮助新手理解正则表达式的基本概念和应用。

在这里插入图片描述

1. 正则表达式基础知识

正则表达式的核心是用一种特殊的语法来定义文本模式,这种模式可以用来匹配或查找字符串。通过正则表达式,可以快速完成复杂的字符串查找和处理任务。理解正则表达式最基本的规则是使用它的关键。

1.1 常用的正则表达式符号

以下是一些常见的正则表达式符号:

  • .:匹配任意单个字符(除了换行符)。
  • ^:匹配字符串的开头。
  • $:匹配字符串的结尾。
  • *:匹配前面的字符零次或多次。
  • +:匹配前面的字符一次或多次。
  • ?:匹配前面的字符零次或一次(非贪婪模式)。
  • {n}:匹配前面的字符 n 次。
  • {n, m}:匹配前面的字符 nm 次。
  • [abc]:匹配 abc 中的任意一个字符。
  • [^abc]:匹配除了 abc 之外的任意字符。
  • |:表示“或”操作。
  • \d:匹配任意数字,相当于 [0-9]
  • \D:匹配任意非数字字符。
  • \w:匹配字母、数字或下划线,相当于 [A-Za-z0-9_]
  • \W:匹配非字母、数字、下划线的字符。
  • \s:匹配空白字符,如空格、制表符等。
  • \S:匹配非空白字符。

1.2 正则表达式的基本语法

要使用正则表达式首先需要理解其语法。例如,表达式 \d{3}-\d{4} 可以用来匹配一个 3 位数字加一个连字符再加 4 位数字的格式(如电话号码“123-4567”)。在 Python 中,正则表达式必须使用原始字符串(即在字符串前面加上 r),否则会引起转义字符错误。

pattern = r"\d{3}-\d{4}"

2. Python 正则表达式 re 模块简介

Python 的 re 模块提供了多种正则表达式的功能,主要包括匹配、搜索、替换等操作。re 模块的核心函数包括:

  • re.match():从字符串开头匹配正则表达式。
  • re.search():在整个字符串中查找第一个匹配的子串。
  • re.findall():找到所有匹配的子串,并返回一个列表。
  • re.finditer():找到所有匹配的子串,并返回一个迭代器。
  • re.sub():替换所有匹配的子串。
  • re.compile():预编译正则表达式,提高性能。

下面将详细讲解这些函数的使用方法。

3. re.match():从字符串开头匹配

re.match() 用于检查字符串是否以某个模式开头。如果匹配成功,它会返回一个 Match 对象,否则返回 None

示例

import retext = "Hello World"
pattern = r"Hello"# 从字符串开头匹配
match = re.match(pattern, text)
if match:print("匹配成功:", match.group())
else:print("匹配失败")

输出

匹配成功: Hello

在上面的示例中,re.match() 从字符串的开头开始匹配 Hello,成功匹配后返回 Match 对象。

4. re.search():在字符串中查找匹配

re.search() 用于在整个字符串中查找第一个匹配的子串,而不仅仅是开头部分。

示例

import retext = "Say Hello World"
pattern = r"Hello"# 在整个字符串中查找
search = re.search(pattern, text)
if search:print("找到匹配:", search.group())
else:print("没有找到匹配")

输出

找到匹配: Hello

re.search() 在字符串中找到 Hello,即使它不在开头。

5. re.findall():查找所有匹配

re.findall() 会返回所有匹配的子串组成的列表,适用于查找多个匹配项的情况。

示例

import retext = "123-4567, 234-5678, 345-6789"
pattern = r"\d{3}-\d{4}"# 查找所有匹配项
matches = re.findall(pattern, text)
print("找到的匹配项:", matches)

输出

找到的匹配项: ['123-4567', '234-5678', '345-6789']

在这里,re.findall() 找到了字符串中所有符合 \d{3}-\d{4} 格式的内容。

6. re.finditer():返回匹配迭代器

re.finditer()re.findall() 类似,但是返回一个迭代器,每个元素是一个 Match 对象,适合需要逐个处理每个匹配结果的情况。

示例

import retext = "abc123def456ghi789"
pattern = r"\d+"# 查找所有匹配项并迭代
matches = re.finditer(pattern, text)
for match in matches:print("找到的匹配项:", match.group())

输出

找到的匹配项: 123
找到的匹配项: 456
找到的匹配项: 789

7. re.sub():替换匹配项

re.sub() 可以将匹配的部分替换为指定的内容,非常适合对字符串进行清理和格式化。

示例

import retext = "Call me at 123-4567 or 987-6543."
pattern = r"\d{3}-\d{4}"# 替换电话号码为 [REDACTED]
new_text = re.sub(pattern, "[REDACTED]", text)
print("替换结果:", new_text)

输出

替换结果: Call me at [REDACTED] or [REDACTED].

在这个示例中,re.sub()[REDACTED] 替换了所有电话号码。

8. re.compile():预编译正则表达式

对于需要多次使用的正则表达式,使用 re.compile() 可以提高效率。re.compile() 会预编译正则表达式并返回一个 Pattern 对象,可以使用该对象执行各种正则操作。

示例

import retext = "Email: abc@example.com and xyz@test.com"
pattern = re.compile(r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}")# 使用预编译对象进行匹配
matches = pattern.findall(text)
print("找到的邮箱地址:", matches)

输出

找到的邮箱地址: ['abc@example.com', 'xyz@test.com']

在这里,我们使用 re.compile() 编译了一个邮箱匹配的正则表达式,之后可以通过 Pattern 对象多次使用该正则表达式。

9. 正则表达式的常见应用示例

9.1 验证电子邮件地址

import reemail = "test@example.com"
pattern = r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
if re.match(pattern, email):print("这是一个有效的邮箱地址")
else:print("无效的邮箱地址")

9.2 提取电话号码

import retext = "Please call 123-4567 or 987-6543 for more information."
pattern = r"\d{3}-\d{4}"
matches = re.findall(pattern, text)
print("提取到的电话号码:", matches)

9.3 替换敏感词

import retext = "This is a badexample of a bad word."
pattern = r"bad"
clean_text = re.sub(pattern, "[censored]", text)
print("替换敏感词后:", clean_text)

10. 总结

正则表达式是处理文本的强大工具,能够简洁高效地完成复杂的字符串匹配和处理任务。在 Python 中使用 re 模块的 matchsearchfindallfinditersub 等方法可以方便地操作字符串。掌握正则表达式的基本语法和常用方法,新手也能灵活运用正则表达式来处理实际应用中的各种字符串匹配问题。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA开发-逻辑分析仪的应用-数字频率计的设计

目录 逻辑分析仪的应用 数字频率计的设计 -基于原理图方法 主控电路设计 分频器设计 顶层电路设计 数字系统开发不但需要进行仿真分析,更重要的是需要进行实际测试。 逻辑分析仪的应用 测试方式:(1)传统的测试方式&#…

.NET 9.0 中 System.Text.Json 的全面使用指南

以下是一些 System.Text.Json 在 .NET 9.0 中的使用方式,包括序列化、反序列化、配置选项等,并附上输出结果。 基本序列化和反序列化 using System; using System.Text.Json; public class Program {public class Person{public string Name { get; se…

Linux 命令 | 每日一学,文本处理三剑客之awk命令实践

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 0x00 前言简述 描述:前面作者已经介绍了文本处理三剑客中的 grep 与 sed 文本处理工具,今天将介绍其最后一个且非常强大的 awk 文本处理输出工具,它可以非常方便…

【第五课】Rust所有权系统(一)

目录 前言 所有权机制的核心 再谈变量绑定 主人变更-所有权转移 总结 前言 这节课我们来介绍下rust中最重要的一个点:所有权系统。这是网上经常说rust无gc的秘密所在。在开始之前,我们来想想JVM系语言,在做垃圾回收的过程,1.…

三周精通FastAPI:42 手动运行服务器 - Uvicorn Gunicorn with Uvicorn

官方文档:Server Workers - Gunicorn with Uvicorn - FastAPI 使用 fastapi 运行命令 可以直接使用fastapi run命令来启动FastAPI应用: fastapi run main.py如创建openapi.py文件: from fastapi import FastAPIapp FastAPI(openapi_url&…

任意文件下载漏洞

1.漏洞简介 任意文件下载漏洞是指攻击者能够通过操控请求参数,下载服务器上未经授权的文件。 攻击者可以利用该漏洞访问敏感文件,如配置文件、日志文件等,甚至可以下载包含恶意代码的文件。 这里再导入一个基础: 你要在网站下…

编写一个生成凯撒密码的程序

plain list(input("请输入需要加密的明文(只支持英文字母):"))key int(input("请输入移动的位数:"))base_A ord(A)base_a ord(a)cipher []for each in plain:if each :cipher.append( )else:if each.i…

RDIFramework.NET CS敏捷开发框架 V6.1发布(.NET6+、Framework双引擎、全网唯一)

RDIFramework.NET C/S敏捷开发框架V6.1版本迎来重大更新与调整,全面重新设计业务逻辑代码,代码量减少一半以上,开发更加高效。全系统引入全新字体图标,整个界面焕然一新。底层引入最易上手的ORM框架SqlSugar,让开发更加…

华为USG5500防火墙配置NAT

实验要求: 1.按照拓扑图部署网络环境,使用USG5500防火墙,将防火墙接口加入相应的区域,添加区域访问规则使内网trust区域可以访问DMZ区域的web服务器和untrust区域的web服务器。 2.在防火墙上配置easy-ip,使trust区域…

Java基础-I/O流

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 字节流 定义 说明 InputStream与OutputStream示意图 说明 InputStream的常用方法 说明 OutputStrea…

RabbitMQ的工作队列在Spring Boot中实现(详解常⽤的⼯作模式)

上文着重介绍RabbitMQ 七种工作模式介绍RabbitMQ 七种工作模式介绍_rabbitmq 工作模式-CSDN博客 本篇讲解如何在Spring环境下进⾏RabbitMQ的开发.(只演⽰部分常⽤的⼯作模式) 目录 引⼊依赖 一.工作队列模式 二.Publish/Subscribe(发布订阅模式) …

<项目代码>YOLOv8 番茄识别<目标检测>

YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…

Python数据分析NumPy和pandas(三十五、时间序列数据基础)

时间序列数据是许多不同领域的结构化数据的重要形式,例如金融、经济、生态学、神经科学和物理学。在许多时间点重复记录的任何内容都会形成一个时间序列。许多时间序列是固定频率的,也就是说,数据点根据某些规则定期出现,例如每 1…

【C++滑动窗口】1248. 统计「优美子数组」|1623

本文涉及的基础知识点 C算法:滑动窗口及双指针总结 LeetCode1248. 统计「优美子数组」 给你一个整数数组 nums 和一个整数 k。如果某个连续子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。 请返回这个数组中 「优美子数组」 的数…

【不写for循环】玩玩行列

利用numpy的并行操作可以比纯用Python的list快很多,不仅如此,代码往往精简得多。 So, 这篇来讲讲进阶的广播和花哨索引操作,少写几个for循环()。 目录 一个二维的例题 一个三维的例题 解法一 解法二 更难的三维例题…

《Java核心技术 卷I》用户界面中首选项API

首选项API 在桌面程序中,通常都会存储用户首选项,如用户最后处理的文件、窗口的最后位置等。 利用Properties类可以很容易的加载和保存程序的配置信息,但有以下缺点: 有些操作系统没有主目录概念,很难为匹配文件找到…

3步实现贪吃蛇

方法很简单,打开页面,复制,粘贴 一.整体思维架构 我们根据游戏的开始,运行,结束,将整个游戏划分成三个部分。在每个部分下面又划分出多个功能,接下来我们就根据模块一一实现功能。 二.Gamesta…

STL序列式容器之list

相较于vector的连续性空间&#xff0c;list相对比较复杂&#xff1b;list内部使用了双向环形链表的方式对数据进行存储&#xff1b;list在增加元素时&#xff0c;采用了精准的方式分配一片空间对数据及附加指针等信息进行存储&#xff1b; list节点定义如下 template<clas…

【论文模型复现】深度学习、地质流体识别、交叉学科融合?什么情况,让我们来看看

文献&#xff1a;蓝茜茜,张逸伦,康志宏.基于深度学习的复杂储层流体性质测井识别——以车排子油田某井区为例[J].科学技术与工程,2020,20(29):11923-11930. 本文目录 一、前言二、文献阅读-基于深度学习的复杂储层流体性质测井识别2.1 摘要2.2 当前研究不足2.3 本文创新2.4 论文…

(一)- DRM架构

一&#xff0c;DRM简介 linux内核中包含两类图形显示设备驱动框架&#xff1a; FB设备&#xff1a;Framebuffer图形显示框架; DRM&#xff1a;直接渲染管理器&#xff08;Direct Rendering Manager&#xff09;&#xff0c;是linux目前主流的图形显示框架&#xff1b; 1&am…