Python re 模块:正则表达式的强大工具

文章目录

  • Python `re` 模块:正则表达式的强大工具
  • 导入 `re` 模块
  • 基本匹配方法
    • re.match()
    • re.search()
    • re.findall()
    • re.finditer()
  • 替换操作
    • re.sub()
  • 分割字符串
    • re.split()
  • 捕获组和非捕获组
    • 捕获组
    • 非捕获组
  • 常用模式符号
  • 实际应用示例
    • 验证电子邮件格式
    • 提取 URL
  • 预定义字符简介
    • 示例代码
      • 1. 匹配数字
      • 2. 匹配非数字字符
      • 3. 匹配空白字符
      • 4. 匹配字母数字字符
  • 性能考虑
  • 总结


Python re 模块:正则表达式的强大工具

正则表达式是处理字符串的强大工具,而 Python 的 re 模块为我们提供了灵活且高效的方式来使用正则表达式。本文将深入探讨 re 模块的常用功能和实际应用示例。

导入 re 模块

在使用正则表达式之前,首先需要导入 re 模块:

import re

基本匹配方法

re.match()

re.match() 从字符串的开始位置匹配一个模式。

pattern = r'\d+'
string = '123abc'match = re.match(pattern, string)
if match:print("匹配成功:", match.group())
else:print("匹配失败")

re.search()

re.search() 在整个字符串中搜索模式。

pattern = r'\d+'
string = 'abc123xyz'search = re.search(pattern, string)
if search:print("找到的匹配:", search.group())
else:print("没有找到匹配")

re.findall()

re.findall() 返回字符串中所有匹配的子串,以列表形式返回。

pattern = r'\d+'
string = 'abc123xyz456'matches = re.findall(pattern, string)
print("所有匹配:", matches)

re.finditer()

re.finditer() 返回一个迭代器,包含所有匹配的对象。

pattern = r'\d+'
string = 'abc123xyz456'for match in re.finditer(pattern, string):print("匹配到:", match.group(), "位置:", match.start())

替换操作

re.sub()

re.sub() 用于替换匹配的字符串。

pattern = r'\d+'
string = 'abc123xyz456'
result = re.sub(pattern, '#', string)
print("替换后的字符串:", result)

分割字符串

re.split()

re.split() 按照正则表达式分割字符串。

pattern = r'\d+'
string = 'abc123xyz456'
result = re.split(pattern, string)
print("分割后的结果:", result)

捕获组和非捕获组

捕获组

使用括号 () 来定义捕获组。

pattern = r'(\d+)-(\d+)-(\d+)'
string = '2024-10-23'match = re.match(pattern, string)
if match:print("年份:", match.group(1), "月份:", match.group(2), "日期:", match.group(3))

非捕获组

使用 (?:...) 来定义非捕获组。

pattern = r'(?:\d+)-(\d+)'
string = '2024-10'match = re.match(pattern, string)
if match:print("月份:", match.group(1))

常用模式符号

符号描述示例
.匹配除换行符外的任何字符a.b 匹配 acb, a1b
^匹配字符串的开头^abc 匹配 abcde
$匹配字符串的结尾xyz$ 匹配 abcxyz
*匹配 0 次或多次ab*c 匹配 ac, abc, abbc
+匹配 1 次或多次ab+c 匹配 abc, abbc 但不匹配 ac
?匹配 0 次或 1 次ab?c 匹配 acabc
{m,n}匹配 m 到 n 次a{2,4} 匹配 aa, aaa, aaaa
[]匹配字符集[abc] 匹配 a, b, c
``或运算符
()捕获组(abc) 捕获 abc
(?:...)非捕获组(?:abc) 不捕获 abc
\d匹配数字\d 匹配 0-9
\D匹配非数字\D 匹配 a-z
\w匹配字母、数字及下划线\w 匹配 a-z, A-Z, 0-9, _
\W匹配非字母、数字及下划线\W 匹配空格、标点等
\s匹配空白字符\s 匹配空格、制表符等
\S匹配非空白字符\S 匹配任何非空格字符

实际应用示例

验证电子邮件格式

def is_valid_email(email):pattern = r'^[\w\.-]+@[\w\.-]+\.\w+$'return re.match(pattern, email) is not Noneemail = 'test@example.com'
print("邮箱格式是否正确:", is_valid_email(email))

提取 URL

def extract_urls(text):pattern = r'https?://[^\s]+'return re.findall(pattern, text)text = "访问我们的官网 https://example.com 和 http://test.com"
urls = extract_urls(text)
print("提取的 URL:", urls)

预定义字符简介

符号描述相当于
\d匹配任何十进制数[0-9]
\D匹配任何非数字字符[^0-9]
\s匹配任何空白字符[\t\n\r\f\v]
\S匹配任何非空白字符[^\t\n\r\f\v]
\w匹配任何字母数字字符(包括下划线)[a-zA-Z0-9_]
\W匹配任何非字母数字字符(包括下划线)[^a-zA-Z0-9_]

示例代码

1. 匹配数字

使用 \d 匹配字符串中的数字:

import retext = "匹配规则这2个字符串3是否匹配规则5则则则7则"
matches = re.findall(r"\d", text)  # 匹配任何单个数字
print(matches)  # 输出: ['2', '3', '5', '7']

如果需要匹配一位或多位数字,可以使用 \d+

import retext = "匹配规则这2个字符串134444是否匹配规则5则则则7则"
matches = re.findall(r"\d+", text)  # 匹配一位或多位数字
print(matches)  # 输出: ['2', '134444', '5', '7']

2. 匹配非数字字符

使用 \D 匹配非数字字符:

import retext = "匹配规则这2个字符串3是否匹配规则5则则则7则"
matches = re.findall(r"\D", text)  # 匹配任何非数字字符
print(matches)  # 输出: ['匹', '配', '规', '则', '这', '个', '字', '符', '串', '是', '否', '匹', '配', '规', '则', '则', '则', '则', '则']

3. 匹配空白字符

使用 \s 匹配字符串中的空白字符:

import retext = "匹配规则   这2个字符串3是否匹\n配规则5则则则7则"
matches = re.findall(r"\s", text)  # 匹配任何空白字符
print(matches)  # 输出: [' ', ' ', ' ', '\n']

使用 \S 匹配非空白字符:

import retext = "匹配规则   这2个字符串3是否匹\n配规则5则则则7则"
matches = re.findall(r"\S", text)  # 匹配任何非空白字符
print(matches)  # 输出: ['匹', '配', '规', '则', '这', '2', '个', '字', '符', '串', '3', '是', '否', '匹', '配', '规', '则', '5', '则', '则', '则', '7', '则']

4. 匹配字母数字字符

使用 \w 匹配包括下划线在内的字母数字字符:

import retext = "https://www.cnblogs.com/"
matches = re.findall(r'\w', text)  # 匹配字母数字字符
print(matches)  # 输出: ['h', 't', 't', 'p', 's', 'w', 'w', 'w', 'c', 'n', 'b', 'l', 'o', 'g', 's', 'c', 'o', 'm']

使用 \W 匹配非字母数字字符:

import retext = "https://www.cnblogs.com/"
matches = re.findall(r'\W', text)  # 匹配非字母数字字符
print(matches)  # 输出: [':', '/', '/', '.', '.', '/']

性能考虑

在处理大量数据时,正则表达式的性能可能会受到影响。可以考虑以下优化策略:

  • 使用原始字符串(r'')来避免转义字符。
  • 避免复杂的表达式,尽量简化模式。
  • 使用编译后的正则表达式。
compiled_pattern = re.compile(r'\d+')
matches = compiled_pattern.findall('abc123xyz456')
print("匹配结果:", matches)

总结

Python 的 re 模块为字符串处理提供了强大的正则表达式支持。通过掌握基本用法和实际应用,能够高效地处理复杂的字符串匹配和替换任务。掌握正则表达式的语法和方法,可以显著提升你的 Python 编程能力。

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

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

相关文章

【独家:AI编程助手Cursor如何revolutionize Java设计模式学习】

【独家:AI编程助手Cursor如何revolutionize Java设计模式学习】 导语 在Java高级编程的世界里,设计模式是每个开发者必须掌握的利器。但是,如何快速理解并灵活运用这些模式呢?让我们一起探索如何借助AI编程助手Cursor,轻松掌握设计模式,提升Java编程技能! 正文 设计模式:J…

易控天地|易控天地标准版3.0(EconTNT STD3.0)安装记录

哈喽,你好啊,我是雷工! 以前使用过的组态软件WinCC、杰控、MCGS、组态王、KingSCADA、KingFunsion等, 关于易控天地去年在现场见到过,接下来安装体验下易控天地; 以下为安装笔记。 01 解压缩 下载完安装…

【YOLO模型】(1)--YOLO是什么

一、什么是YOLO YOLO(You Only Look Once)是一种基于深度学习的目标检测算法,由Joseph Redmon等人于2016年提出。 1. 核心思想 它的核心思想是将目标检测问题转化为一个回归问题,通过一个神经网络直接预测目标的类别和位置。 …

[Linux] CentOS7替换yum源为阿里云并安装gcc详细过程(附下载链接)

前言 CentOS7替换yum源为阿里云 yum是CentOS中的一种软件管理器,通过yum安装软件,可以自动解决包依赖的问题,免去手工安装依赖包的麻烦。 yum使用了一个中心仓库来记录和管理软件的依赖关系,默认为mirrorlist.centos.org&#xf…

1208. 尽可能使字符串相等

Problem: 1208. 尽可能使字符串相等 题目描述 给定两个相同长度的字符串 s 和 t,将字符串 s 转换为字符串 t 需要消耗开销,开销是两个字符的 ASCII 码差值的绝对值。还有一个最大预算 maxCost,我们需要在这个预算范围内,找到 s 中…

时钟分频电路之Innovus自动产生的_clock_gen skew group盘点

我们在查看时钟树综合的log时会发现工具会自动生成一些skew group,这些skew group的名字都是以_clock_gen开头的。 skew_group _clock_gen_CLK_CORE_PLL_clk_reg_1/func: insertion delay [min0.020, max0.064, avg0.038, sd0.022], skew [0.045 vs 0.050], 100% {…

SSL证书有免费的吗?在哪里可以申请到?——附带申请步骤

申请免费的SSL证书通常可以通过以下几个步骤完成,这里以使用JoySSL为例进行说明,因为JoySSL提供了一个免费、自动化和开放的证书颁发机构(CA)来促进网站从HTTP向HTTPS的转换。 步骤: 选择工具: 访问JoySSL…

二百六十八、Kettle——同步ClickHouse清洗数据到Hive的DWD层静态分区表中(每天一次)

一、目的 实时数仓用的是ClickHouse,为了避免Hive还要清洗数据,因此就直接把ClickHouse中清洗数据同步到Hive中就行 二、所需工具 ClickHouse:clickhouse-client-21.9.5.16 Kettle:kettle9.2 Hadoop:hadoop-3.1.3…

汽车免拆诊断案例 | 2019 款奥迪 A6L 车行驶中偶发熄火

故障现象  一辆2019款奥迪A6L车,搭载2.0T发动机,累计行驶里程约为9万km。车主反映,车辆行驶中偶发熄火,故障频率较高。 故障诊断  接车后试车,起动发动机,可以正常起动着机。使用故障检测仪检测&#x…

Vue项目的创建

安装Vue工具 Vue CLI Vue CLI Vue.js 开发的标准工具,Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统 npm install -g vue/cli安装之后,你就可以在命令行中访问 vue 命令。你可以通过简单运行 vue,看看是否展示出了一份所有可用命令的…

基于SSM邮票鉴赏系统的设计

管理员账户功能包括:系统首页,个人中心,用户管理,邮票信息管理,邮票分类管理,文章信息管理,系统管理,个人分享管理 用户账号功能包括:系统首页,个人中心&…

【正点原子K210连载】第四十八章 自学习分类实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第四十八章 自学习分类实验 在上一章节中,介绍了利用maix.KPU模块实现了MNIST的手写数据识别,本章将继续介绍利用maix.KPU模块实现的自学习分类。通过本章的学习,读者将学习到自学习分类应用在CanMV上的实现。 本章分为如下几个小节&#xf…

Hallo2 长视频和高分辨率的音频驱动的肖像图像动画 (数字人技术)

HALLO2: LONG-DURATION AND HIGH-RESOLUTION AUDIO-DRIVEN PORTRAIT IMAGE ANIMATION 论文:https://arxiv.org/abs/2410.07718 代码:https://github.com/fudan-generative-vision/hallo2 模型:https://huggingface.co/fudan-generative-ai/h…

后端C++

前言 1. Task0 1.1 获取你的服务器 1.2 对服务器进行基本操作 分别创建文件夹dir_a, dir_b, dir_c进入dir_a,创建a.txt, b.txt, c.txt 将a.txt, b.txt, c.txt 分别复制成: a.txt.bak, b.txt.bak, c.txt.bak 将a.txt, b.txt, c.txt 分别重命名为: a_new.txt, b_new.txt, c_ne…

凹凸性和拐点的概念

二阶导不存在也可能是拐点 判断拐点的充分条件

Android Studio USB调试真机映射屏幕画面

Android Studio USB调试真机映射屏幕画面 文章目录 Android Studio USB调试真机映射屏幕画面一、USB连手机并设置开发者模式1.1 报错信息1.2 启用开发者选项和 USB 调试:1.3 手机配置选项 二、Android Studio 开启手机投屏功能 一、USB连手机并设置开发者模式 1.1 …

Flutter 小技巧之 equatable 包解析以及宏编程解析

今天我们聊聊 equatable 包的实现,并通过 equatable 去理解 Dart 宏编程的作用和实现,对于 Flutter 开发者来说,Dart 宏编程可以说是「望眼欲穿」。 equatable 正如 equatable 这个包名所示,它的功能很简单,主要是用…

计算机毕业设计hadoop+spark知识图谱中药推荐系统 中药材推荐系统 中药可视化 中药数据分析 中药爬虫 机器学习 深度学习 人工智能 大数据

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 摘 要 本文所探讨的领域是…

【Linux】“echo $变量“ 命令打印变量值的底层原理

在 shell 中,echo $变量 命令的工作原理涉及几个关键步骤,主要是由 shell 解释器来处理变量的查找和替换。以下是详细的过程: 变量展开的过程顺序 变量引用: 在命令行中,变量通常以 $variable_name 或 ${variable_…

若依前后端分离超详情版

若依系统安装流程 1.安装Ubuntu系统 1.1 新建虚拟机 打开VMware Workstation,选择文件->新建虚拟机->典型(推荐T)->安装程序光盘映像文件->输入虚拟的名字->一直下一步即可 安装程序光盘映像文件 注意:选择ub…