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

Python进阶(4)--正则表达式

正则表达式

在Python中,正则表达式(Regular Expression,简称Regex)是一种强大的文本处理工具,它允许你使用一种特殊的语法来匹配、查找、替换字符串中的文本。

在这之前,还记得之前我们是通过什么方法分割字符串的嘛?

strs = "a,b;c@d"
print(strs.split(","))	#以“,”为分割点分割
------------------
['a', 'b;c@d']

字符串中的方法:split()方法:以括号内给入的东西为分割点分割,返回一个列表。

这是我们之前的方法,对于上述的字符串,如果要是想将a、b、c都分割出来还需要以";“、”@"为分隔带你再次分割,数据量大了之后就会变得很麻烦。于是,给我们带来新方法啦!

元字符

因为正则表达式也是用字符串表示的,所以首先了解如何用字符来描述字符如果直接给出字符,就是精确匹配,但有一些字符加上转义符后就具有特殊含义:

\d可以匹配一个数字
例如:'00\d'可以匹配'007',但无法匹配'00A''\d\d\d'可以匹配'010'
-------------------------
\w可以匹配一个字母或数字
例如:'\w\w\d'可以匹配'py3'
-------------------------
'.'可以匹配任意字符
例如:'py.'可以匹配'pyc''pyo''py!'等等
-------------------------------------------
\s可以匹配任何空白字符,包括空格、制表符、换页符等等

常见的元字符有:

在这里插入图片描述

正则进阶

要匹配变长的字符,在正则表达式中,用*表示任意个字符(包括0个),用+表示至少一个字符,用?表示0个或1个字符,用{n}表示n个字符,用{n,m}表示n~m个字符。来看一个复杂的例子:\d{3}\s+\d{3,8}

\d{3}表示匹配3个数字,例如'010'
\s可以匹配一个空格(也包括Tab等空白符),所以\s+表示至少有一个空格,例如匹配 '空格''空格空格''空格空格空格'等;
\d{3,8}表示3-8个数字,例如'1234567','123','12345'
综上,该正则表达式可以匹配以任意个空格隔开的带三位区号的电话号码

要做更精确地匹配,则还需编写更复杂的正则表达式:

[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线
[0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串
比如'a100''0_Z''Py3000'等等
[a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的命名规则
[a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精确地限制了长度是1-20个字符(前面1个字符,后面最多19个字符)
A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'
^表示行的开头,^\d表示必须以数字开头
$表示行的结束,\d$表示必须以数字结束

了解了这些新东西之后,我们来看看怎么使用到他们吧!

导入re模块

re模块使Python语言拥有全部的正则表达式功能!

# 正则表达式
import re

导入模块之后我们来看看怎么使用它:

正则方法

split()方法

开头说的字符串自带split方法可以指定分隔符进行字符串的切分,同样re模块也提供了split方法,可以按照指定的正则表达式进行字符串的切分:

import re
if __name__ == '__main__':strs = "a,b;c@d"print(re.split(r'[,;@]',strs))
----------------------
输出结果:
['a', 'b', 'c', 'd']

match()方法

re模块提供了一个match方法,可以判断正则表达式是否匹配,如果匹配成功,返回一个Match对象,否则返回None,比如:

phone = "1555-123456789"
print(re.match(r'\d{4}-\d{7}', phone))	#\d{7}中范围只到7,故此输出只能到第七个数
----------------
输出结果:
<re.Match object; span=(0, 12), match='1555-1234567'>
#匹配一个变量名称
print(re.match(r"[A-Za-z_]\w*", "AKBDkfnh983u"))
print(re.match(r"[p|P]ython","python"))
-------------------
输出结果:
<re.Match object; span=(0, 12), match='AKBDkfnh983u'>
<re.Match object; span=(0, 6), match='python'>
print("ABC\\001")
print(re.match(r"\w+\\\d+","ABC\\001"))		#使用r标记字符串,那么就不再需要考虑转义的问题了
--------------
输出结果:
<re.Match object; span=(0, 7), match='ABC\\001'>

groups()分组

除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。用()表示的就是要提取的分组(Group),比如:

匹配出时间:

t = "19:59:59"
# 匹配出时间
# 分组使用的是在正则内部使用 括号 第几个括号就是第几个组别
print(re.match(r"([0-1]\d|2[0-3]):([0-5]\d):([0-5]\d)", t).groups())	#小时、分钟、秒都用()分开了
[0-1]\d表示小时中的第一个数为0~1,第二个数\d即0~9都可以
print(re.match(r"([0-1]\d|2[0-3]):([0-5]\d):([0-5]\d)", t).group(1))	#group()括号内的参数表示组别
print(re.match(r"([0-1]\d|2[0-3]):([0-5]\d):([0-5]\d)", t).group(2))
print(re.match(r"([0-1]\d|2[0-3]):([0-5]\d):([0-5]\d)", t).group(3))
-----------------
输出结果:
('19', '59', '59')
19
59
59

贪婪匹配

正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。

例如,匹配出数字后面的0:

# 贪婪匹配
# 怎么结束贪婪匹配  ? 结束贪婪匹配
# ^表示以什么开头   $ 表示以什么结尾
num = "10233333000000"
print(re.match(r"^(\d+?)(0+)$", num).groups())		#^(\d+?)以数字开头;(0+)$以0结尾
-----------------
输出结果:
('10233333', '000000')

预编译

如果大家规则都类似,那可以提前将规则定义好,比如:

num1 = "102333000000"
num2 = "1023333000000"
num3 = "103333000000"
num4 = "133333000000"

怎么将它提前编译好呢?

使用compile方法预编译:

re_comp = re.compile(r"^(\d+?)(0+)$")

调用:

re_comp = re.compile(r"^(\d+?)(0+)$")
print(re_comp.match(num1))
print(re_comp.match(num2))
print(re_comp.match(num3))
print(re_comp.match(num4))
-------------------------------
输出结果:
<re.Match object; span=(0, 12), match='102333000000'>
<re.Match object; span=(0, 13), match='1023333000000'>
<re.Match object; span=(0, 12), match='103333000000'>
<re.Match object; span=(0, 12), match='133333000000'>

总结

本篇介绍了:

  1. 元字符:用字符来描述字符。
  2. 正则进阶:
    1. 用*表示任意个字符(包括0个),用+表示至少一个字符。
    2. 用?表示0个或1个字符,用{n}表示n个字符。
    3. 用{n,m}表示n~m个字符。
  3. 正则方法:
    1. split()方法:指定分隔符进行字符串的切分。
    2. match方法:可以判断正则表达式是否匹配,如果匹配成功,返回一个Match对象,否则返回None。
    3. groups()分组:提取子串的强大功能。用()表示的就是要提取的分组(Group)。
  4. 贪婪匹配:正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。
    1. “?” 结束贪婪匹配。
    2. "^"表示以什么开头 , “$” 表示以什么结尾。
    3. 预编译:如果大家规则都类似,可以使用compile方法提前将规则定义好。

相关文章:

Python进阶(4)--正则表达式

正则表达式 在Python中&#xff0c;正则表达式&#xff08;Regular Expression&#xff0c;简称Regex&#xff09;是一种强大的文本处理工具&#xff0c;它允许你使用一种特殊的语法来匹配、查找、替换字符串中的文本。 在这之前&#xff0c;还记得之前我们是通过什么方法分割…...

RCA连接器是什么?一文读懂

RCA连接器&#xff0c;也就是我们在电视机、DVD播放器、通讯设备、立体声设备和游戏设备后面常见的彩色插头&#xff0c;其历史可以追溯到近一个世纪以前。这种现今广泛使用的电缆接口&#xff0c;最初是由美国无线电公司&#xff08;RCA&#xff09;开发并命名的&#xff0c;在…...

【linux】服务器安装NVIDIA驱动

【linux】服务器安装NVIDIA驱动 【创作不易&#xff0c;求点赞关注收藏】&#x1f600; 文章目录 【linux】服务器安装NVIDIA驱动一、关闭系统自带驱动nouveau二、下载英伟达驱动三、安装英伟达驱动1、禁用X服务器和相关进程2、在TTY终端安装驱动3、验证是否安装成功4、重新启…...

【达梦数据库】关于用户、模式、表空间等如何理解?

与MySQL的用户有所区别&#xff0c;MySQL是单实例多库&#xff0c;DM7以上版本是单库多实例架构&#xff0c; MySQL访问方式&#xff1a; 一个root访问多个库&#xff0c;访问前切换一下就ok 比如MySQL到DM的迁移是&#xff0c;MySQL的一个库对应dm中的一个表空间和一个用户。比…...

一篇就够mysql高阶知识总结

一、事务的ACID原则 序号原则说明1原子性&#xff08;Atomicity&#xff09;事务是数据库的逻辑工作单位&#xff0c;事务中包括的诸操作要么都做&#xff0c;要么都不做2一致性&#xff08;Consistency&#xff09;事务执行的结果必须是使数据库从一个一致性状态变到另一个一…...

CTF-Web习题:[BJDCTF2020]ZJCTF,不过如此

题目链接&#xff1a;[BJDCTF2020]ZJCTF&#xff0c;不过如此 解题思路 访问靶场链接&#xff0c;出现的是一段php源码&#xff0c;接下来做一下代码审阅&#xff0c;发现这是一道涉及文件包含的题 主要PHP代码语义&#xff1a; file_get_contents($text,r); 把$text变量所…...

【IEEE出版】第四届能源工程与电力系统国际学术会议(EEPS 2024)

第四届能源工程与电力系统国际学术会议&#xff08;EEPS 2024&#xff09; 2024 4th International Conference on Energy Engineering and Power Systems 重要信息 大会官网&#xff1a;www.iceeps.com 大会时间&#xff1a;2024年8月9-11日 大会…...

浅谈Vue:text-align: center、align-items: center、justify-content: center三种居中的区别和用法

text-align: center、align-items: center 和 justify-content: center 是用于不同布局场景下的CSS属性。它们在水平和垂直居中元素方面有所不同&#xff0c;具体取决于你使用的布局模型&#xff08;如块级元素、Flexbox、Grid&#xff09;。以下是它们的区别和适用场景&#x…...

理解UI设计:UI设计师的未来发展机遇

UI设计师的出现是互联网时代的设计变革。随着移动互联网的快速发展&#xff0c;移动产品设计师非常短缺。高薪资让许多其他行业的设计师已经转向了UI设计。那么什么是UI设计呢&#xff1f;UI设计师负责什么&#xff1f;UI设计的发展趋势和就业前景如何&#xff1f;这些都是许多…...

关键字 internal

在C#中&#xff0c;internal 关键字是一个访问修饰符&#xff0c;它用于限制类型或类型成员的访问性。当一个类型&#xff08;类、结构体、接口、枚举等&#xff09;或类型成员&#xff08;字段、属性、方法、事件等&#xff09;被声明为 internal 时&#xff0c;它只能在同一程…...

C学习(数据结构)-->单链表习题

目录 一、环形链表 题一&#xff1a;环形链表 思路&#xff1a; 思考一&#xff1a;为什么&#xff1f; 思考二&#xff1a;快指针一次走3步、4步、......n步&#xff0c;能否相遇 step1&#xff1a; step2&#xff1a; 代码&#xff1a; 题二&#xff1a; 环形链表 I…...

MATLAB6:M文件和控制流

文章目录 一、实验目的二、实验内容三、仿真结果四、实践中遇到的问题及解决方法 一、实验目的 1. 熟悉运用MATLAB的控制指令。   2. 理解M脚本文件和函数文件的本质区别。   3. 能够运用所学知识&#xff0c;编制程序解决一般的计算问题。 二、实验内容 1.for循环结构及注…...

网页数据抓取:融合BeautifulSoup和Scrapy的高级爬虫技术

网页数据抓取&#xff1a;融合BeautifulSoup和Scrapy的高级爬虫技术 在当今的大数据时代&#xff0c;网络爬虫技术已经成为获取信息的重要手段之一。Python凭借其强大的库支持&#xff0c;成为了进行网页数据抓取的首选语言。在众多的爬虫库中&#xff0c;BeautifulSoup和Scrap…...

Linux应用——网络基础

一、网络结构模型 1.1C/S结构 C/S结构——服务器与客户机&#xff1b; CS结构通常采用两层结构&#xff0c;服务器负责数据的管理&#xff0c;客户机负责完成与用户的交互任务。客户机是因特网上访问别人信息的机器&#xff0c;服务器则是提供信息供人访问的计算机。 例如&…...

白骑士的C++教学实战项目篇 4.3 多线程网络服务器

系列目录 上一篇&#xff1a;白骑士的C教学实战项目篇 4.2 学生成绩管理系统 在这一节中&#xff0c;我们将实现一个多线程网络服务器项目&#xff0c;通过该项目&#xff0c;我们将学习套接字编程的基础知识以及如何使用多线程处理并发连接。此外&#xff0c;我们还将实现一个…...

Go语言并发编程-Context上下文

Context上下文 Context概述 Go 1.7 标准库引入 context&#xff0c;译作“上下文”&#xff0c;准确说它是 goroutine 的上下文&#xff0c;包含 goroutine 的运行状态、环境、现场等信息。 context 主要用来在 goroutine 之间传递上下文信息&#xff0c;包括&#xff1a;取…...

React@16.x(62)Redux@4.x(11)- 中间件2 - redux-thunk

目录 1&#xff0c;介绍举例 2&#xff0c;原理和实现实现 3&#xff0c;注意点 1&#xff0c;介绍 一般情况下&#xff0c;action 是一个平面对象&#xff0c;并会通过纯函数来创建。 export const createAddUserAction (user) > ({type: ADD_USER,payload: user, });这…...

【Qt】QTcpServer/QTcpSocket通信

这里写目录标题 1.pro文件2.服务器3.客户端 1.pro文件 QT network2.服务器 h文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QTcpServer> #include <QTcpSocket>QT_BEGIN_NAMESPACE namespace Ui { class MainW…...

【时时三省】单元测试 简介

目录 1,单元测试简介 2,单元测试的目的 3,单元测试检查范围 4,单元测试用例设计方法 5,单元测试判断通过标准 6,测试范围 7,测试频率 8,输出成果 经验建议: 山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 1,单元测试简介 单元测试在以V模型…...

中间件——Kafka

两个系统各自都有各自要去做的事&#xff0c;所以只能将消息放到一个中间平台&#xff08;中间件&#xff09; Kafka 分布式流媒体平台 程序发消息&#xff0c;程序接收消息 Producer&#xff1a;Producer即生产者&#xff0c;消息的产生者&#xff0c;是消息的入口。 Brok…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...