22. 正则表达式
一、概述
正则表达式(regular expression)又称 规则表达式,是一种文本模式(pattern)。正则表达式使用一个字符串来描述、匹配具有相同规格的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式的核心功能就是处理文本。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
二、re模块
在 Python 中提供了 re 模块来使用正则表达式。每一个字符串都可以视为一个简单的正则表达式。
re.findall(pattern, string, flags=0) # 去整个文本中查找所有符合正则表达式的文本
re.search(pattern, string, flags=0) # 去整个文本中去匹配,返回匹配成功的第一个
re.match(pattern, string, flags=0) # 从开始位置开始匹配,返回匹配成功的第一个
re.split(pattern, string, maxsplit=0, flags=0) # 根据正则表达式切割字符串
re.Match.group([group1, ...]) # 返回这个匹配对象或者特定子组
re.Match.groups(default=None) # 返回一个唯一或者全部子组的元组
在 Python 中,主要有两种方法完成模式匹配:“搜索”(searching),即在字符串任意部分中搜索匹配的模式;而 “匹配”(matching)是指判断一个字符串能否从起始处全部或者部分匹配某个模式。搜索通过 search() 函数或方法来实现,而匹配是调用 match() 函数或方法实现。
match() 函数试图从字符串的起始部分对模式进行匹配。如果匹配成功,就返回一个匹配对象(Match 对象);如果匹配失败,就返回 None,匹配对象(Match 对象)的 group() 方法能够用于显示那个成功的匹配。
search() 的工作方式与 match() 完全一致,不同之处在于 search() 会用它的字符串参数,在任意位置对给定正则表达式模式搜索第一次出现的匹配情况。如果搜索到成功的匹配,就会返回一个匹配对象(Match 对象);否则,返回 None。
由此可见,match() 试图从字符串的起始部分开始匹配模式,而 search() 函数不但会搜索模式在字符串中第一次出现的位置,而且严格地对字符串从左到右搜索。
findall() 查询字符串中某个正则表达式模式全部的非重复出现情况。这与 search() 在执行字符串搜索时类似,但与 match() 和 search() 的不同之处在于,findall() 总是返回一个列表。如果 findall() 没有找到匹配的部分,就返回一个空列表,但如果匹配成功,列表将包含所有成功的匹配部分(从左到有按出现顺序排列)。
import recontent = "你好啊,小樱同学!欢迎你加入小樱班。从现在开始你就是我的朋友啊。小樱同志,请多多关照。"
regex = "小樱"result = re.findall(regex,content)
print(result)result = re.search(regex,content)
print(result.group())result = re.match(regex,content)
print(result)result = re.split(r"[,!。]",content)
print(result)
三、基础语法
3.1、转义字符
使用正则表达式去检索某些特殊字符的时候,需要用到转义字符,否则检索不到结果,甚至会报错;在 Python 中,\ 具有转义的意思,会对紧随其后的字符进行转义,如果我们想使用普通的 \ ,需要在使用一个 \ 对它进行转义。
import recontent = "abc$def(123(456))"
regex = "\(456"result = re.findall(regex,content)
print(result)result = re.match(regex,content)
print(result)
需要用到转义符号的常见字符如下:. * + ( ) $ / \ ? [ ] ^ { }
3.2、字符匹配符
字符匹配符 | 含义 | 实例 | 解释 |
---|---|---|---|
[] | 可接收的字符列表 | [abc] | a、b、c 中的任意 1 个字符 |
[^] | 不可接收的字符列表 | [^abc] | 除 a、b、c 之外的任意 1 个字符 包括数字和特殊符号 |
- | 连字符 | a-z | 任意一个小写字母 |
import recontent = "abc123def4567AbC"result = re.findall("[abc]",content)
print(result)result = re.findall("[^abc]",content)
print(result)result = re.findall("[a-z]",content)
print(result)
3.3、元字符
元字符 | 含义 |
---|---|
. | 匹配单个除换行符以外的任意字符 |
\d | 匹配 0~9 任意一个数字 |
\D | 匹配单个任意非数字字符 |
\s | 匹配任意空白字符 |
\S | 匹配任意不是空白符的字符 |
\w | 匹配字母或数字或下划线的任意字符 |
\W | 匹配任意不是字母、数字、下划线的字符 |
import recontent = "abc123def4567AbC"result = re.findall("\\d\\d\\d",content)
print(result)result = re.findall(r"\d\w",content)
print(result)
元字符的大写表示不匹配;
3.4、重复限定符
重复限定符用于指定其前面的字符和组合项连续出现多少次。
重复限定符 | 意义 |
---|---|
? | 0 次 或 1 次 |
* | 0 次 或 多次 |
+ | 1 次 或 多次 |
{n} | 正好出现 n 次 |
{n,} | 至少出现 n 次 |
{n,m} | 出现 n 次 至 m 次 |
import recontent = "abc123def4567AbC89d115200a1"resutl = re.findall(r"\d{3,5}",content)
print(resutl)result = re.findall(r"\d+",content)
print(result)
3.5、定位符
定位符,用来指定要匹配的字符串出现的位置。
定位符 | 含义 |
---|---|
^ | 指定起始字符 |
$ | 指定结束字符 |
\b | 匹配目标字符串的边界, 边界指的是字串间有空格,或者目标字符串的结束位置 |
\B | 匹配非单词边界 |
import recontent = "abc123 def4567abc123abc abc89 d115200 a1abc"result = re.findall("^abc",content)
print(result)result = re.findall("abc$",content)
print(result)result = re.findall(r"abc\b",content)
print(result)result = re.findall("ab\B",content)
print(result)
3.6、选择匹配符
正则表达式用符号 | 来表示或,也叫做分支条件,当满足正则表达里的分支条件的任何一种条件时,都会当成匹配成功。
import recontent = "你好啊,小樱同学,欢迎你加入小樱班,从现在开始你就是我的朋友啊,小樱同志,请多多关照。"
regex = "小樱同学|小樱同志"result = re.findall(regex,content)
print(result)
3.7、分组组合
重复限定符是作用在与它相邻的最左边的一个字符。正则表达式中可以使用小括号 () 来做分组,也就是括号中的内容会作为一个整体。
3.7.1、捕获分组
我们可以使用 group() 方法匹配对象方法,从一个分组中获取匹配的文本。正则表达式字符串中的第一对括号是第 1 组,第二对括号是第 2 组,依次类推。向 group() 匹配对象方法传入整数就可以取得匹配文本的不同部分。向 group() 传入 0 或者不传入参数,将返回这个匹配的文本。
如果想要一次就获取所有的分组,我们可以使用 groups() 方法。
捕获分组 | 说明 |
---|---|
(pattern) | 非命名捕获。捕获匹配的子字符串。编号为零的第一个捕获是由整个正则表达式模式匹配的文本,其它捕获结果则根据左括号的顺序从 1 开始自动编号。 |
(P<name>pattern) | 命名捕获。将匹配的子字符串捕获到一个组名称或编号名称中。用于 name 的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号。 |
import recontent = "我是小樱,我的身份证明是37028419860401232X"
regex = r"\d{6}(\d{4})(\d{2})(\d{2})\d{3}[\dX]"result = re.search(regex,content)
year = result.group(1)
month = result.group(2)
day = result.group(3)print(result.group(0))
print(f"{year}-{month}-{day}")
import recontent = "我是小樱,我的身份证明是37028419860401232X"
regex = r"\d{6}(?P<year>\d{4})(?P<month>\d{2})(?P<day>\d{2})\d{3}[\d|X]"result = re.search(regex,content)
year = result.group("year")
month = result.group("month")
day = result.group("day")print(result.group(0))
print(f"{year}-{month}-{day}")
3.7.2、非捕获分组
非捕获分组 | 说明 |
---|---|
(?:pattern) | 匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储以后使用的匹配。 例如:“小樱(?:同学|同志)” 等价于 “小樱同学|小樱同志” |
(?=pattern) | 它是一个非捕获匹配。 例如:“Harmony(?=2|3)” 匹配 “Harmony2” 中的 “Harmony”,但不匹配 “Harmony1” 中的 “Harmony” |
(?!pattern) | 该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配。 例如:“Harmony(?=2|3)” 匹配 “Harmony1” 中的 “Harmony”,但不匹配 “Harmony2” 中的 “Harmony” |
import recontent = "你好啊,小樱同学,欢迎你加入小樱班,从现在开始你就是我的朋友啊,小樱同志,请多多关照。"regex = "小樱(?:同学|同志)"
result = re.findall(regex,content)
print(result)regex = "小樱(?=同学|同志)"
result = re.findall(regex,content)
print(result)regex = "小樱(?!同学|同志)"
result = re.findall(regex,content)
print(result)
3.8、非贪婪匹配
当 ? 元字符紧随任何其它限定符 (*、+、?、{n}、{n,}、{n,m})之后,匹配模式是 “非贪婪匹配”。非贪婪匹配搜索到、尽可能短的字符串。而默认的贪婪匹配搜索到的尽可能长的字符串。
import recontent = "abc111111abc"# 贪婪匹配
result = re.findall(r"\d{3,5}",content)
print(result)# 非贪婪匹配
result = re.findall(r"\d{3,5}?",content)
print(result)
相关文章:
22. 正则表达式
一、概述 正则表达式(regular expression)又称 规则表达式,是一种文本模式(pattern)。正则表达式使用一个字符串来描述、匹配具有相同规格的字符串,通常被用来检索、替换那些符合某个模式(规则&…...

Flink Python作业快速入门
Flink Python快速入门_实时计算 Flink版(Flink)-阿里云帮助中心 import argparse # 用于处理命令行参数和选项,使程序能够接收用户通过命令行传递的参数 import logging import sysfrom pyflink.common import WatermarkStrategy, Encoder, Types from pyflink.data…...
自定义函数库
求两点距离 double dis(double x1, double y1, double x2, double y2){return sqrt(pow(x2-x1, 2)pow(y2-y1, 2)); }判断闰年 bool isLeapYear(int year){return year%40 && year%100!0 || year%4000; }判断素数 bool isPrime(int num){if(num<2) return false;f…...
FreeRTOS例程2-任务挂起恢复与使用中断遇到的坑!
任务挂起简单点理解就是现在不需要执行这个任务,让它先暂停,就是挂起。恢复就是从刚才挂起的状态下继续运行。 API函数 任务挂起vTaskSuspend() 函数原型(tasks.c中): void vTaskSuspend( TaskHandle_t xTaskToSuspend ) 1. 参数: xTaskTo…...

L23.【LeetCode笔记】验证回文串(剖析几种解法)
目录 1.题目 2.自解 提交结果 反思 大小写之间的位运算 提交结果 3.代码优化 提交结果 编辑 4.LeetCode网友提供的解法 1.题目 https://leetcode.cn/problems/XltzEq/description/ 给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数…...

FPGA 17 ,FPGA 与 SR-IOV虚拟化技术,高性能计算与虚拟化技术的结合(FPGA 与 SR-IOV 和 PCI,高性能计算与虚拟化的完美融合)
目录 前言 一. SR-IOV 的起源与发展 1. SR-IOV 的起源与时间线 2. SR-IOV 的诞生原因 3. SR-IOV 的详细介绍 二. SR-IOV 和 PCI 之间的关系 三. PCI 的起源与演进 1. PCI 的起源与时间线 2. PCI 的关键特性 四. FPGA 的独特魅力 1. FPGA 的定义与特性 2. FPGA 的内…...

解决navicat 导出excel数字为科学计数法问题
一、原因分析 用程序导出的csv文件,当字段中有比较长的数字字段存在时,在用excel软件查看csv文件时就会变成科学技术法的表现形式。 其实这个问题跟用什么语言导出csv文件没有关系。Excel显示数字时,如果数字大于12位,它会自动转化…...
[Unity] AppLovin Max接入Native 广告 Android篇
把下载下来的maxnativelibrary-release-文件放在Plugins/Android下 将这一行加入到mainTemplate.gradle文件中 implementation androidx.constraintlayout:constraintlayout:2.1.4添加下面的两个脚本 using System; using System.Collections; using System.Collections.Gener…...

Source Insight 4.0的安装
一、安装与破解 1、下载Source Insight 4.0安装包 https://pan.baidu.com/s/1t0u1RM19am0lyzhlNTqK9Q?pwdnvmk 2、下载程序破解补丁包 https://pan.baidu.com/s/1irvH-Kfwjf4zCCtWJByqJQ 其中包含文件si4.pediy.lic 和 sourceinsight4.exe。 3、安装下载的Source Insight …...

远程调试软件对比与使用推荐
远程调试软件对比与使用推荐 远程调试是现代软件开发中不可或缺的一部分,尤其是在处理分布式系统、云端服务或远程服务器上的问题时。以下是对几种常见远程调试工具的详细对比和推荐使用场景。 1. GDB (GNU Debugger) 特点 开源:完全免费且开源&…...

鸿蒙项目云捐助第二讲鸿蒙图文互动基本程序实现
鸿蒙项目云捐助第二讲鸿蒙图文互动基本程序实现 结合第一讲建立的“Hello World”程序,得到如下图所示的界面。 这里的“Hello World”是通过“Priview”显示出来的。在这个界面中进行开发的前奏曲,可以通过点击更换图片的案例来体会一下鸿蒙Next的开发…...
求解球面的一组正交标架
目录 求解球面的一组正交标架 求解球面的一组正交标架 球面 r ( u , v ) ( a cos u cos v , a cos u sin v , a sin u ) \mathbf{r}(u,v)\left(a\cos u\cos v,a\cos u\sin v,a\sin u\right) r(u,v)(acosucosv,acosusinv,asinu), 求得 r u ( − a sin u c…...
php.ini 文件上传/执行时间/部分配置新手教程
1、上传文件大小配置 一般需要同时配置“upload_max_filesize”、“post_max_size”,配置格式如下: file_uploads On ;是否允许HTTP文件上传 upload_max_filesize 2M ;设置单个文件上传的最大尺寸 post_max_size 8M ;设置 POST 请求体的最大尺寸&am…...
【Leetcode Top 100】102. 二叉树的层序遍历
问题背景 给你二叉树的根节点 r o o t root root,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 数据约束 树中节点数目在范围 [ 0 , 2000 ] [0, 2000] [0,2000] 内 − 1000 ≤ N o d e . v a l ≤ 1000 -1…...

【C++笔记】AVL树
前言 各位读者朋友们大家好,上期我们讲解了map和set这两大容器的使用,这一期我们讲解最早的平衡二叉搜索树——AVL树。 目录 前言一. AVL树的概念二. AVL树的实现2.1 AVL树的结构2.2 AVL树的插入2.2.1 AVL树插入一个值的大致过程2.2.2 平衡因子的更新2…...

【竞技宝】LOL:JDG官宣yagao离队
北京时间2024年12月13日,在英雄联盟S14全球总决赛结束之后,各大赛区都已经进入了休赛期,目前休赛期也快进入尾声,LPL大部分队伍都开始陆续官宣转会期的动向,其中JDG就在近期正式官宣中单选手yagao离队,而后者大概率将直接选择退役。 近日,JDG战队在官方微博上连续发布阵容变动消…...

双目摄像头标定方法
打开matlab 找到这个标定 将双目左右目拍的图像上传(左右目最好不少于20张) 等待即可 此时已经完成标定,左下角为反投影误差,右边为外参可视化 把这些误差大的删除即可。 点击导出 此时回到主页面,即可看到成功导出 Ca…...

相差不超过k的最多数,最长公共子序列(一),排序子序列,体操队形,青蛙过河
相差不超过k的最多数 链接:相差不超过k的最多数 来源:牛客网 题目描述: 给定一个数组,选择一些数,要求选择的数中任意两数差的绝对值不超过 𝑘 。问最多能选择多少个数? 输入描述: 第一行输入两个正整…...

【自然语言处理与大模型】使用llama.cpp将HF格式大模型转换为GGUF格式
llama.cpp的主要目标是在本地和云端的各种硬件上以最小的设置和最先进的性能实现LLM推理。是一个专为大型语言模型(LLM)设计的高性能推理框架,完全使用C和C编写,没有外部依赖,这使得它可以很容易地被移植到不同的操作系…...

MongoDB存储照片和文件存储照片的区别在那里?
一、维度对比 比较维度MongoDB存储照片文件系统存储照片数据模型使用文档存储数据,可以存储不同结构的照片。以文件的形式存储照片,每个文件独立存在。性能高效的数据检索,适用于大规模应用程序中的高效检索和访问。但在处理大量高分辨率图片…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...

【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...