22. 正则表达式

news2024/12/14 9:57:12

一、概述

  正则表达式(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 re

content = "你好啊,小樱同学!欢迎你加入小樱班。从现在开始你就是我的朋友啊。小樱同志,请多多关照。"
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 re

content = "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 re

content = "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 re

content = "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 re

content = "abc123def4567AbC89d115200a1"

resutl = re.findall(r"\d{3,5}",content)
print(resutl)

result = re.findall(r"\d+",content)
print(result)

3.5、定位符

  定位符,用来指定要匹配的字符串出现的位置。

定位符含义
^指定起始字符
$指定结束字符
\b匹配目标字符串的边界,
边界指的是字串间有空格,或者目标字符串的结束位置
\B匹配非单词边界
import re

content = "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 re

content = "你好啊,小樱同学,欢迎你加入小樱班,从现在开始你就是我的朋友啊,小樱同志,请多多关照。"
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 re

content = "我是小樱,我的身份证明是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 re

content = "我是小樱,我的身份证明是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 re

content = "你好啊,小樱同学,欢迎你加入小樱班,从现在开始你就是我的朋友啊,小樱同志,请多多关照。"

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 re

content = "abc111111abc"

# 贪婪匹配
result = re.findall(r"\d{3,5}",content)
print(result)

# 非贪婪匹配
result = re.findall(r"\d{3,5}?",content)
print(result)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2259243.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jenkins与SonarQube持续集成搭建及坑位详解

Jenkins和SonarQube都是软件开发过程中常用的工具,它们在代码管理、构建、测试和质量管理方面发挥着重要作用。以下是关于Jenkins与SonarQube的作用及整合步骤环境搭建的详细解释: 一、Jenkins与SonarQube的作用 Jenkins: Jenkins是一个开源的持续集成和交付工具,它可以帮…

item2 for macos

安装Item2 brew install iterm2 查看终端类型 cat /etc/shells Mac OS X 10.15 已经将默认的shell从Bash换成了zsh&#xff0c;所以不用安装&#xff0c;10.15以前的可以使用下面的命令进行安装 brew install zsh 安装Oh My ZSH # curl sh -c "$(curl -fsSL https://ra…

[搜广推]王树森推荐算法——基于物体的协同过滤

基于物体的协同过滤 ItemCF 基于物体的协同过滤&#xff08;Item-Based Collaborative Filtering&#xff0c;简称ItemCF&#xff09;是一种经典的推荐系统算法 基本思想 量化用户对物品的兴趣&#xff0c;通过分析用户的行为来找到与目标物品相似的其他物品&#xff0c;然后…

3D 生成重建035-DiffRF直接生成nerf

3D 生成重建035-DiffRF直接生成nerf 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 本文提出了一种基于渲染引导的三维辐射场扩散新方法DiffRF&#xff0c;用于高质量的三维辐射场合成。现有的方法通常难以生成具有细致纹理和几何细节的三维模型&#xff0c;并且容易出…

计算机毕业设计Python+CNN卷积神经网络高考推荐系统 高考分数线预测 高考爬虫 协同过滤推荐算法 Vue.js Django Hadoop 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

linux - 存储管理

1.了解硬件 -- 磁盘 硬盘有机械硬盘(HDD)和固态硬盘(SDD) 接下来&#xff0c;主要以机械磁盘为例(更具代表性&#xff0c;在linux系统层面&#xff0c;无论是机械磁盘还是固态硬盘&#xff0c;文件的读取和写入都iNode(索引节点)管理文件的元数据和实际数据块) 1.盘片&#x…

打造高效的HIS与DAT文件解析工具

在工业数据采集和存储中&#xff0c;HIS 和 DAT 文件是非常常见的二进制数据格式。然而&#xff0c;解析这些固定块大小的二进制文件并将其转换为易读的 CSV 格式并非易事。本文将深入讲解如何使用 Python 和 PyQt5 打造一款图形化工具&#xff0c;轻松解析和转换这些文件&…

设计模式-装饰器模式(结构型)与责任链模式(行为型)对比,以及链式设计

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1.装饰器模式1.1概念1.2作用1.3应用场景1.4特点1.5类与对象关系1.6实现 2责任链模式2.1概念2.2作用2.3应用场景2.4特点2.5类与对象关系2.6实现 3.对比总结 前言…

【JavaEE】网络(2)

一、网络编程套接字 1.1 基础概念 【网络编程】指网络上的主机&#xff0c;通过不同的进程&#xff0c;以编程的方式实现网络通信&#xff1b;当然&#xff0c;我们只要满足进程不同就行&#xff0c;所以即便是同一个主机&#xff0c;只要是不同进程&#xff0c;基于网络来传…

题海拾贝:力扣 141.环形链表

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 1、题…

SEC_ASA 第二天作业

拓扑 按照拓扑图配置 NTP&#xff0c;Server端为 Outside路由器&#xff0c;Client端为 ASA&#xff0c;两个设备的 NTP传输使用MD5做校验。&#xff08;安全 V4 LAB考点&#xff09; 提示&#xff1a;Outside路由器作为 Server端要配置好正确的时间和时区&#xff0c;ASA防…

IDEA 未启用lombok插件的Bug

项目中maven已引用了lombok依赖&#xff0c;之前运行没有问题的&#xff0c;但有时启动会提示&#xff1a; java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled. Your processor is: com.sun.proxy.$Proxy8 Lombok support…

markdown入门

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

知识库系统,集成neo4j,集成activiti工作流,集成es全文检索,知识图谱血缘关系,nlp知识库

一、项目介绍 一款全源码&#xff0c;可二开&#xff0c;可基于云部署、私有部署的企业级知识库云平台&#xff0c;一款让企业知识变为实打实的数字财富的系统&#xff0c;应用在需要进行文档整理、分类、归集、检索、分析的场景。 为什么建立知识库平台&#xff1f; 助力企业…

AI技术架构:从基础设施到应用

人工智能&#xff08;AI&#xff09;的发展&#xff0c;正以前所未有的速度重塑我们的世界。了解AI技术架构&#xff0c;不仅能帮助我们看懂 AI 的底层逻辑&#xff0c;还能掌握其对各行业变革的潜力与方向。 一、基础设施层&#xff1a;AI 技术的坚实地基 基础设施层是 AI 技…

钉钉机器人消息推送类型案例

CSDN 目录展示 目录 钉钉机器人消息推送1- 文本text类型推送代码案例推送结果参数说明 2- 链接Link类型推送代码案例推送结果参数说明 3- Markdown类型推送代码案例1推送结果1推送代码案例2推送结果2推送代码案例2 (版本2)推送结果2(版本2)参数说明 4- 整体跳转ActionCard类型…

6_Sass 选择器函数 --[CSS预处理]

Sass 提供了一系列的选择器函数&#xff0c;用于操作和组合CSS选择器。这些函数可以帮助你更灵活地创建样式规则&#xff0c;并且可以减少重复代码。以下是几个常用的选择器函数及其用法&#xff1a; 1. selector-append($selector1, $selector2...) selector-append($select…

Wireshark如何查看数据包时间间隔

1.如果数据包量不大&#xff0c;抓包本身也不大&#xff0c;建议从绝对时间判断&#xff0c;打开wireshark软件&#xff0c;并点开相应要分析的抓包文件。 进入到最上方菜单<视图>,在弹出菜单选择时间显示格式&#xff0c;再在右侧菜单中选择自捕获经过的秒数。 这样就可…

jvm内存优化方式

1. JVM&#xff08;Java Virtual Machine&#xff09;&#xff1a; • 定义&#xff1a;Java虚拟机&#xff0c;是运行Java字节码的抽象计算机。 • 内存管理&#xff1a;负责内存的分配和回收&#xff0c;是JVM内存优化的核心。 2. 堆&#xff08;Heap&#xff09;&#xff1a…

【AI日记】24.12.13 kaggle 比赛 2-3 大扫除、断舍离、自己做饭

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 参加&#xff1a;kaggle 比赛 Regression with an Insurance Dataset参考&#xff1a;kaggle 回归类入门比赛 House Prices - Advanced Regression Techniques内容&#xff1a;构建自己的EDA&#xff08…