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存储照片文件系统存储照片数据模型使用文档存储数据,可以存储不同结构的照片。以文件的形式存储照片,每个文件独立存在。性能高效的数据检索,适用于大规模应用程序中的高效检索和访问。但在处理大量高分辨率图片…...

协变量的概念
协变量的概念 协变量的概念 协变量(Covariate)是在统计分析和研究中,与因变量(被研究的主要变量)相关,并且可能对因变量产生影响的其他变量。它不是研究的主要关注对象,但需要在分析过程中被考虑进去,因为它可能会混淆或改变自变量与因变量之间的关系。举例说明 教育研…...

【[LeetCode每日一题】Leetcode 1768.交替合并字符串
Leetcode 1768.交替合并字符串 题目描述: 给定两个字符串 word1 和 word2,以交替的方式将它们合并成一个新的字符串。即,第一个字符来自 word1,第二个字符来自 word2,第三个字符来自 word1,依此类推。如果…...

SRT协议学习
SRT(Secure Reliable Transport)协议是一种开源的视频传输协议,旨在提供安全,可靠,低延迟的视频流传输。以下是SRT协议的一些关键的工作原理。 1 安全传输,SRT通过使用AES加密和数据完整性验证来确保数据的安全传输。它可以在不信…...

南昌大学《2024年837自动控制原理真题》 (完整版)
本文内容,全部选自自动化考研联盟的:《南昌大学873自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2024年真题 Part1:2024年完整版真题 2024年真题...

ASP.NET Core 应用程序的启动与配置:Program.cs 文件的全面解析
ASP.NET Core 应用程序的启动与配置:Program.cs 文件的全面解析 Program.cs 是 ASP.NET Core 应用程序的入口点,负责应用程序的启动和配置。以下是 Program.cs 文件中完成的主要工作,按逻辑步骤进行总结: 1. 创建和配置主机环境…...

2020-12-02 数字过滤
缘由 C语言 数组:数字过滤-CSDN问答 void chuli(int n15236) {int aa[47]{0},j0,m0;while(n)aa[j]n%10,n/10;while(j)if(aa[--j]%2)m*10,maa[j];cout << m << ends; } void 数字过滤(int n 15236) {int aa[47]{0}, j 0, m 0;while (…...

长短期记忆神经网络(LSTM)介绍
1、应用现状 长短期记忆神经网络(LSTM)是一种特殊的循环神经网络(RNN)。原始的RNN在训练中,随着训练时间的加长以及网络层数的增多,很容易出现梯度爆炸或者梯度消失的问题,导致无法处理较长序列数据,从而无…...

数据结构 ——二叉树转广义表
数据结构 ——二叉树转广义表 1、树转广义表 如下一棵树,转换为广义表 root(c(a()(b()()))(e(d()())(f()(j(h()())())))) (根(左子树)(右子树)) 代码实现 #include<stdio.h> #include<stdlib.h>//保存…...

chattts生成的音频与字幕修改完善,每段字幕对应不同颜色的视频,准备下一步插入视频。
上一节中,实现了先生成一个固定背景的与音频长度一致的视频,然后插入字幕。再合并成一个视频的方法。 但是:这样有点单了,所以: 1.根据字幕的长度先生成视频片断 2.在片段上加上字幕。 3.合并所有片断,…...

数据结构开始——时间复杂度和空间复杂度知识点笔记总结
好了,经过了漫长的时间学习c语言语法知识,现在我们到了数据结构的学习。 首先,我们得思考一下 什么是数据结构? 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素…...