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 re

text = "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 re

text = "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 re

text = "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 re

text = "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 re

text = "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 re

text = "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 re

email = "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 re

text = "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 re

text = "This is a bad

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

10. 总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenGL Phong光照模型-镜面反射-反射方向推导

反射方向计算公式如下: 其中R表示反射方向,L表示入射方向,N表示法向(单位向量)。 该公式推导如下: 1、首先入射方向、反射方向向量可分成两个分量分别是: 与法向N平行分量Ln、垂直于法向N分量…

006配置DHCP服务器

DHCP可以自动为计算机分配IP地址 环境准备 准备两台Linux系统和一台windows系统DHCP 服务器的IP地址为:192.168.239.100192.168.239.0/24 网络中有两个IP地址空间可以分配,因为100作为dhcp服务器地址 分别是: 192.168.239.1 ~ 192.168.239.…

基于微信小程序的药店管理系统+LW示例参考

1.项目介绍 系统角色:管理员、普通用户功能模块:管理员(用户管理、药品分类管理、药品信息管理、系统管理、订单管理等),普通用户(查看相关药品信息、充值、登录注册、个人中心、购物车、我的订单等&#…

https网站 请求http图片报错:net::ERR_SSL_PROTOCOL_ERROR

问题描述 场景: https网站,请求http图片资源报错:net::ERR_SSL_PROTOCOL_ERROR 原因: Chrome 81 中,对混合内容资源加载策略进行了改变,会自动升级到 https:// ,如果无法通过 https:// 加载&am…

JAVA后端生成图片滑块验证码 springboot+js完整案例

前言 现在大部分网部都是图片滑块验证码,这个得要与后端联动起来才是确保接口安全性 通过我们系统在发送手机短息时都会选进行滑块验证,但是我们要保证发送短息接口的全安,具体路思如下 那么这个滑块的必须是与后端交互才能保证安全性&…

Golang | Leetcode Golang题解之第556题下一个更大元素III

题目&#xff1a; 题解&#xff1a; func nextGreaterElement(n int) int {x, cnt : n, 1for ; x > 10 && x/10%10 > x%10; x / 10 {cnt}x / 10if x 0 {return -1}targetDigit : x % 10x2, cnt2 : n, 0for ; x2%10 < targetDigit; x2 / 10 {cnt2}x x2%10 -…

ceph介绍和搭建

1 为什么要使用ceph存储 什么是对象存储&#xff1f; 对象存储并没有向文件系统那样划分为元数据区域和数据区域&#xff0c;而是按照不同的对象进行存储&#xff0c;而且每个对象内部维护着元数据和数据区域。因此每个对象都有自己独立的管理格式。 对象存储优点&#xff1a…

MFC图形函数学习07——画扇形函数

绘制扇形函数是MFC中绘图的基本函数&#xff0c;它绘制的仍是由椭圆弧与椭圆中心连线构成的椭圆扇形&#xff0c;特例是由圆弧与圆心连线构成的圆扇形。 一、绘制扇形函数 原型&#xff1a;BOOL Pie(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4); …

macOS15.1及以上系统bug:开发者证书无法打开,钥匙串访问无法打开一直出现图标后立马闪退

团队紧跟苹果最新系统发现bug:今日设备信息如下,希望能带给遇到这个问题的开发者一点帮助。 错误图如下: 点击证书文件后,先出现钥匙串访问图标,后立马闪退消失 中间试过很多方法,都是一样的表现,最后好在解决了,看网上也没有相关的帖子,这里直接写解决办法和导致原因…

Kotlin约束泛型参数必须继承自某个父类

Kotlin约束泛型参数必须继承自某个父类 open class SuperData { }class DataA : SuperData {constructor() {println("DataA constructor")} }class DataB : SuperData {constructor() {println("DataB constructor")} }fun <T : SuperData> myfun(p…

量子计算及其在密码学中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 量子计算及其在密码学中的应用 量子计算及其在密码学中的应用 量子计算及其在密码学中的应用 引言 量子计算概述 定义与原理 发展…

【大数据学习 | HBASE高级】storeFile文件的合并

Compaction 操作分成下面两种&#xff1a; Minor Compaction&#xff1a;是选取一些小的、相邻的StoreFile将他们合并成一个更大的StoreFile&#xff0c;对于删除、过期、多余版本的数据不进行清除。 Major Compaction&#xff1a;是指将所有的StoreFile合并成一个StoreFile&am…

任务中心全新升级,新增分享接口文档功能,MeterSphere开源持续测试工具v3.4版本发布

2024年11月5日&#xff0c;MeterSphere开源持续测试工具正式发布v3.4版本。 在这一版本中&#xff0c;系统设置方面&#xff0c;任务中心支持实时查看系统即时任务与系统后台任务&#xff1b;接口测试方面&#xff0c;新增接口文档分享功能、接口场景导入导出功能&#xff0c;…

RNN(循环神经网络)详解

1️⃣ RNN介绍 前馈神经网络&#xff08;CNN&#xff0c;全连接网络&#xff09;的流程是前向传播、反向传播和参数更新&#xff0c;存在以下不足&#xff1a; 无法处理时序数据&#xff1a;时序数据长度一般不固定&#xff0c;而前馈神经网络要求输入和输出的维度是固定的&a…

github加速下载zip

加速下载 1. 第一个网站 https://github.moeyy.xyz/把需要下载的链接复制进去&#xff0c;点下载https://github.com/dotnet/sdk/archive/refs/tags/v8.0.400.zip2. 第二个网站 https://gh-proxy.com/ 加速访问 2、查询github的ip地址 打开此网址&#xff1a;[IP 查询](http…

微服务电商平台课程三:搭建后台服务

前言 上节课,我们一起完成基础环境搭建,这节课, 我们利用上节课搭建我们电商平台.这节课我们采用开源代码进行搭建, 不论大家后续从事什么行业,都要学会站在巨人的肩膀上. 之前所说的,整个微服务平台的技术栈也是非常多的, 由于时间和效果的关系, 我们不可能从每个技术一步一…

模拟 [leecode 54] 螺旋矩阵

一、题解&#xff1a;上下左右四条线不断收紧 int l 0, r matrix[0].size() - 1;int high 0, low matrix.size() - 1;从左到右&#xff0c;顶部一层遍历完往下移一位&#xff0c;high&#xff1b;if(high>low) break;//遍历完了从上到下&#xff0c;遍历完右侧往左移一位…

丹摩征文活动|Llama3.1的部署与使用指南

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 丹摩征文 1. 初识Llama3.12. 部署流程创建实例登录实例部署LLama3.1 3. 实践使用教程4. 实践感想 前言&#xff1a;人工智能&#xff08;AI&…

人际交往中,想要有好人缘,需做到“三要”,做到一个,也是好事

人际交往中&#xff0c;想要有好人缘&#xff0c;需做到“三要”&#xff0c;做到一个&#xff0c;也是好事 在这个世上&#xff0c;每个人都是一座孤岛&#xff0c;但通过人际交往这座桥梁&#xff0c;我们能够彼此相连&#xff0c;共同编织出一张温暖的社会网络。 好人缘&a…

Sql server 备份还原方法

备份 方法1&#xff0c;选择对应的数据库名-------》右键 任务---------》备份 默认备份类型 完整 文件后缀 .bak 方法2,选择对应的数据库名-------》右键 任务----------》生成脚本 选择要编写的数据库对象(表&#xff0c;视图&#xff0c;存储过程等) 选择对应的 服…