当前位置: 首页 > 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; 一、缓存处理的核…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...