【第八节】python正则表达式
目录
一、python中的re模块
1.1 基本匹配和搜索
1.2 替换和分割
1.3 编译正则表达式
二、正则表达式对象
2.1 re.RegexObject 和 re.MatchObject
2.2 正则表达式修饰符 - 可选标志
2.3 正则表达式模式
2.4 正则表达式实例
一、python中的re模块
正则表达式是一种独特的字符序列,它能够协助你轻松地验证一个字符串是否符合特定的模式。
自Python 1.5版本以来,引入了re模块,该模块支持Perl风格的正则表达式模式。
re模块赋予了Python完整的正则表达式处理能力。
通过compile函数,可以根据一个模式字符串和可选的标志参数创建一个正则表达式对象。这个对象包含了一系列方法,用于进行正则表达式的匹配和替换操作。
此外,re模块还提供了与这些方法功能相同的函数,这些函数以一个模式字符串作为它们的第一个参数。本章节将重点介绍Python中常用的正则表达式处理函数。
1.1 基本匹配和搜索
Python中的正则表达式是通过`re`模块来实现的,这个模块提供了一系列函数和方法来处理字符串匹配和搜索。以下是一些常用的正则表达式功能和示例:
### 基本匹配和搜索
1. **匹配字符串**:使用`re.match()`函数检查字符串是否以特定模式开始。
2. **搜索字符串**:使用`re.search()`函数在字符串中查找第一个匹配的模式。
它们的语法规则类似:
re.match(pattern, string, flags=0)
re.search(pattern, string, flags=0)

re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
3. **查找所有匹配**:使用`re.findall()`函数返回字符串中所有匹配的列表。
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。
语法格式为:
findall(string[, pos[, endpos]])
参数:
- string : 待匹配的字符串。
- pos : 可选参数,指定字符串的起始位置,默认为 0。
- endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。
三者用法如下:
import re# 匹配字符串
result = re.match(r'Hello', 'Hello, world!')
print(result) # 输出: <re.Match object; span=(0, 5), match='Hello'># 搜索字符串
result = re.search(r'world', 'Hello, world!')
print(result) # 输出: <re.Match object; span=(7, 12), match='world'># 查找所有匹配
result = re.findall(r'\w+', 'Hello, world!')
print(result) # 输出: ['Hello', 'world']
4. finditer
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。语法如下:
re.finditer(pattern, string, flags=0)
代码举例:
# -*- coding: UTF-8 -*-import reit = re.finditer(r"\d+","12a32bc43jf3")
for match in it: print (match.group() )
5. flags参数
在Python的re模块中,re.match()函数和类似的正则表达式函数(如re.search()、re.findall()等)可以使用flags参数来修改正则表达式的匹配行为。flags参数可以是一个或多个标志的组合,这些标志通过按位或(|)操作符组合在一起。以下是一些常用的flags值:
1)re.IGNORECASE (re.I):
忽略大小写进行匹配。
2)re.MULTILINE (re.M):
多行模式,改变^和$的行为,使它们分别匹配每一行的开始和结束,而不仅仅是整个字符串的开始和结束。
3)re.DOTALL (re.S):
使.特殊字符匹配包括换行符在内的所有字符。
4)re.UNICODE (re.U):
使\w、\W、\b、\B、\d、\D、\s、\S等字符类遵循Unicode字符属性数据库的规则。这个标志在Python 3中是默认行为,因为默认情况下字符串是Unicode的。
5)re.ASCII (re.A):
使\w、\W、\b、\B、\d、\D、\s、\S等字符类只匹配ASCII字符。
6)re.VERBOSE (re.X):
允许编写更具可读性的正则表达式,可以包含注释和空格,这些在匹配时会被忽略。
7)re.DEBUG:
显示有关编译表达式的调试信息。
这些标志可以组合使用,例如:
import repattern = r'hello'
string = 'Hello, hello, HELLO in the world!'# 使用忽略大小写标志
matches = re.findall(pattern, string, re.IGNORECASE)
print(matches) # 输出: ['Hello', 'hello', 'HELLO']
在这个例子中,re.IGNORECASE标志被传递给re.findall()函数,使得正则表达式模式'hello'在匹配时忽略大小写,因此它能够匹配字符串中的所有大小写变体。
6. group函数
我们可以使用 group(num) 或 groups() 匹配对象函数来获取匹配表达式。

#!/usr/bin/python
import reline = "Cats are smarter than dogs"matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)if matchObj:print "matchObj.group() : ", matchObj.group()print "matchObj.group(1) : ", matchObj.group(1)print "matchObj.group(2) : ", matchObj.group(2)
else:print "No match!!"
以上实例执行结果如下:
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
1.2 替换和分割
1. **替换字符串**:使用`re.sub()`函数替换字符串中的匹配模式。
Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。
语法:
re.sub(pattern, repl, string, count=0, flags=0)
参数:
- pattern : 正则中的模式字符串。
- repl : 替换的字符串,也可为一个函数。
- string : 要被查找替换的原始字符串。
- count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
当`repl`参数是一个函数时,`re.sub()`函数会在每次匹配时调用这个函数,并将匹配对象作为参数传递给该函数。函数返回的值将作为替换字符串。以下是一个示例代码,展示了如何使用函数作为`repl`参数:
import redef replacer(match):# 获取匹配对象的组matched_text = match.group(0)# 对匹配的文本进行处理,例如转换为大写return matched_text.upper()# 定义正则表达式模式
pattern = r'\b\w+\b' # 匹配单词# 定义要处理的字符串
string = 'hello world, this is a test.'# 使用函数作为 repl 参数
result = re.sub(pattern, replacer, string, flags=re.IGNORECASE)print(result) # 输出: 'HELLO WORLD, THIS IS A TEST.'
在这个例子中,`replacer`函数接收一个匹配对象`match`,并返回匹配文本的大写版本。`re.sub()`函数在每次匹配时调用`replacer`函数,并用函数返回的值替换匹配的文本。`flags=re.IGNORECASE`标志使得匹配忽略大小写,因此所有的单词都会被转换为大写。
你可以根据需要自定义`replacer`函数,以实现不同的替换逻辑。
2. **分割字符串**:使用`re.split()`函数根据模式分割字符串。
split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:
re.split(pattern, string[, maxsplit=0, flags=0])

import re# 替换字符串
result = re.sub(r'world', 'Python', 'Hello, world!')
print(result) # 输出: Hello, Python!# 分割字符串
result = re.split(r'\s+', 'Hello world')
print(result) # 输出: ['Hello', 'world']
1.3 编译正则表达式
为了提高效率,可以使用`re.compile()`函数将正则表达式编译成一个正则表达式对象,然后使用该对象的方法进行匹配和搜索。
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
语法格式为:
re.compile(pattern[, flags])
参数:
-
pattern : 一个字符串形式的正则表达式
-
flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
- re.I 忽略大小写
- re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
- re.M 多行模式
- re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
- re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
- re.X 为了增加可读性,忽略空格和 # 后面的注释
import re# 编译正则表达式
pattern = re.compile(r'\d+')# 使用编译后的对象进行匹配
result = pattern.findall('123 456 789')
print(result) # 输出: ['123', '456', '789']
### 常用正则表达式符号
- `.`:匹配任意单个字符(除了换行符)。
- `^`:匹配字符串的开头。
- `$`:匹配字符串的结尾。
- `*`:匹配前面的字符零次或多次。
- `+`:匹配前面的字符一次或多次。
- `?`:匹配前面的字符零次或一次。
- `\d`:匹配任意数字。
- `\w`:匹配任意字母、数字或下划线。
- `\s`:匹配任意空白字符。
这些符号可以组合使用,以构建复杂的正则表达式模式。
### 示例
import re# 匹配电子邮件地址
pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
text = 'Contact us at support@example.com'
result = re.search(pattern, text)
print(result) # 输出: <re.Match object; span=(15, 31), match='support@example.com'>
通过这些功能和方法,Python的`re`模块提供了一个强大的工具集,用于处理和操作字符串中的模式匹配。
二、正则表达式对象
2.1 re.RegexObject 和 re.MatchObject
re.RegexObject
re.compile() 返回 RegexObject 对象。
re.MatchObject
group() 返回被 RE 匹配的字符串。
- start() 返回匹配开始的位置
- end() 返回匹配结束的位置
- span() 返回一个元组包含匹配 (开始,结束) 的位置
2.2 正则表达式修饰符 - 可选标志
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:

2.3 正则表达式模式
正则表达式模式采用了特定的语法规则来定义匹配规则:
字母和数字在模式中直接表示其本身。在正则表达式模式中,字母和数字将匹配与其相同的字符。
当字母和数字前面加上一个反斜杠(\)时,它们通常会获得不同的含义,从而执行特殊的匹配功能。
标点符号除非经过转义处理,否则它们不会匹配其自身,而是执行特定的功能,表示某种特殊含义。
反斜杠本身是一个特殊字符,因此需要通过另一个反斜杠来进行转义。
鉴于正则表达式中频繁使用反斜杠,建议采用原始字符串(以 'r' 开头)来表示这些模式,以避免转义字符的混淆。例如,模式元素如 r'\t' 实际上等同于 '\\t',它们都匹配制表符。
以下表格概述了正则表达式模式语法中的特殊元素。若在定义模式时附加了可选的标志参数,某些特殊元素的行为可能会发生变化。



2.4 正则表达式实例


相关文章:
【第八节】python正则表达式
目录 一、python中的re模块 1.1 基本匹配和搜索 1.2 替换和分割 1.3 编译正则表达式 二、正则表达式对象 2.1 re.RegexObject 和 re.MatchObject 2.2 正则表达式修饰符 - 可选标志 2.3 正则表达式模式 2.4 正则表达式实例 一、python中的re模块 正则表达式是一种独特的…...
三大浏览器Google Chrome、Edge、Firefox内存占用对比
问题 Chrome、Edg、Firefox三家究竟谁的占用少 结论 打开一个页面内存占用 Firefox>Edge>Chrome 打开打量页面内存占用 Firefox>Chrome>Edge 从监视器可以看到Edge增加一个页面增加一个页面不到100M而其它浏览器需要150M左右;Firefox浏览器主线程内存占用800M比…...
【wiki知识库】08.添加用户登录功能--后端SpringBoot部分
目录 一、今日目标 二、SpringBoot后端实现 2.1 新增UserLoginParam 2.2 修改UserController 2.3 UserServiceImpl代码 2.4 创建用户上下文工具类 2.5 通过token校验用户(重要) 2.6 创建WebMvcConfig 2.7 用户权限校验拦截器 一、今日目标 上篇…...
vue中nextTick的作用
nextTick是Vue.js提供的一个非常有用的方法,其主要作用是在DOM更新之后执行延迟回调函数。以下是nextTick的具体作用及其实现原理的详细解析: nextTick的作用 确保DOM更新完成: 当Vue实例的数据发生变化时,Vue会异步地更新DOM。…...
计算机网络面试-核心概念-问题理解
目录 1.计算机网络OSI协议七层结构功能分别是什么?如何理解这些功能 2.物理层、数据链路层、网络层、传输层和应用层,这五个层之间功能的关系,或者说是否存在协调关系 3. 数据链路层功能理解 4.MAC地址和以太网协议 5.以太网协议中的CSMA…...
go语言创建协程
前言 Go 语言中,协程是通过 go 关键字来创建的,这使得 Go 语言成为实现并发程序的一个非常直观和强大的工具。Go 运行时管理着协程,这些协程在内部被称为 goroutine。 协程(goroutines)本身是轻量级的线程,…...
RabbitMQ之基于注解声明队列交换机:使用@RabbitListener实现消息监听
文章目录 什么是RabbitListener?队列和交换机的基本概念使用RabbitListener注解声明队列和交换机代码解析1. QueueBinding2. 消费者方法 运行原理应用场景总结 在现代的微服务架构中,消息队列是一种重要的异步通信机制。RabbitMQ作为一种流行的消息代理软…...
【grafana 】mac端grafana配置的文件 grafana.ini 及login
brew services start grafana 以后,怎么知道mac端的配置文件的路径 brew services restart grafana#brew services start grafana在macOS上使用Homebrew安装并启动Grafana服务后,通常的配置文件路径是在以下两个位置之一: Homebrew默认配置文件路径:/usr/local/etc/grafana…...
程序员如何在人工智能时代保持核心竞争力
目录 1.概述 1.1. 技术深度与广度的平衡 1.2. 软技能的培养 1.3. 持续学习和适应性 1.4. 理解和应用AI 1.5. 伦理和责任意识 2.AI辅助编程对程序员工作的影响 2.1.AI工具对编码实践的积极影响 2.2.AI工具的潜在风险 2.3.如何平衡利与弊 3.程序员应重点发展的核心能力…...
回溯排列+棋盘问题篇--代码随想录算法训练营第二十三天| 46.全排列,47.全排列 II,51. N皇后,37. 解数独
46.全排列 题目链接:. - 力扣(LeetCode) 讲解视频: 组合与排列的区别,回溯算法求解的时候,有何不同? 题目描述: 给定一个不含重复数字的数组 nums ,返回其 所有可能…...
ESXI加入VMware现有集群提示常规性错误
集群内有vSphere6.5和6.7的版本,都开启了EVC 这台老服务器是DELL R710添加时报错,网上查了些资料说要重装ESXI或者关闭EVC等等 最终解决方法是,给这台ESXI配置一个NTP服务器,同步系统时间,之后即可正常加入集群 往期文…...
数字噪音计(声级计)【AR814数字噪音计】
系统介绍 声级计,又叫噪音计,是噪声测量中最基本的仪器。声级计一般由电容式传声器、前置放大器、衰减器、放大器、频率计权网络以及有效值指示表头等组成。 声级计的工作原理是:由传声器将声音转换成电信号,再由前置放大器放大…...
【Vue3】图片未加载成功前占位
背景 在写项目时,加载图片未成功前,会出现空白页面,太影响美观和体验感 解决方案 1. element ui通过slot占位符解决 2. 自定义指令 原生img标签可以通过自定义指令解决,img标签有onload和onerror事件,都是在渲染成…...
AbstractQueuedSynchronizer之AQS
目录 AQS简单入门为什么说AQS是JUC包下的重要基石AQS能干嘛?实际实现原理AQS自身成员变量Node内部类的成员变量源码解读总结 AQS简单入门 AQS是抽象的队列同步器,是用来实现锁或者其它同步器组件的公共基础部分的抽象实现,是重量级基础框架及…...
<数据集>起重机识别数据集<目标检测>
数据集格式:VOCYOLO格式 图片数量:2984张 标注数量(xml文件个数):2984 标注数量(txt文件个数):2984 标注类别数:1 标注类别名称:[cranes] 使用标注工具:labelImg 标注规则:对…...
04--Docker
前言:前面写过关于DockerKubernetes的部署,主要是针对国产化linux系统的适配问题,并没有对docker进行复习。这里整理一下docker的知识点,用作容器化微服务的起点,主要为日常工作配置使用,本章可能有点长&am…...
MiniCPM-V: A GPT-4V Level MLLM on Your Phone 手机上的 GPT-4V 级多模态大模型
GitHub - OpenBMB/MiniCPM-V: MiniCPM-V 2.6: A GPT-4V Level MLLM for Single Image, Multi Image and Video on Your Phone 2408.01800 (arxiv.org) 目录 Introduction Model Architecture Training End-side Deployment MiniCPM-V是一种高效的多模态大型语言模型&…...
Unity初识
1:下载Unity Hub 下载地址:Unity官方下载_Unity最新版_从Unity Hub下载安装 | Unity中国官网 建议直接使用unity hub因为支持比较全面,适合新手 有中文 管理 编辑器等等功能支持 下载安装不过多介绍 2:Unity Hub汉化 因为我…...
【游戏引擎之路】登神长阶(九)——《3D游戏编程大师技巧》:我想成为游戏之神!
5月20日-6月4日:攻克2D物理引擎。 6月4日-6月13日:攻克《3D数学基础》。 6月13日-6月20日:攻克《3D图形教程》。 6月21日-6月22日:攻克《Raycasting游戏教程》。 6月23日-7月1日:攻克《Windows游戏编程大师技巧》。 7月…...
Linux:线程同步之信号量
信号量 (1)What(什么是信号量) 提供一种计数器的方式控制对共享资源的访问;当计数器大于0时,请求资源成功并计数器-1;当计数器小于0时,线程阻塞,等待其它线程执行signal(V操作&…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
