当前位置: 首页 > 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…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]

报错信息&#xff1a;libc.so.6: cannot open shared object file: No such file or directory&#xff1a; #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...