初始Python篇(7)—— 正则表达式
找往期文章包括但不限于本期文章中不懂的知识点:
个人主页:我要学编程(ಥ_ಥ)-CSDN博客
所属专栏: Python
目录
正则表达式的概念
正则表达式的组成
元字符
限定符
其他字符
正则表达式的使用
正则表达式的常见操作方法
match方法的使用:
search方法的使用
findall方法的使用
sub方法的使用
split方法的使用
视频代码解读
章节选择题
章节实战
正则表达式的概念
在上一篇文章中,我们学习了字符串这种数据类型,基于字符串而广泛使用的就是正则表达式了。我们先来看它的概念。正则表达式(Regular Expression,简称regex或regexp)是一种文本模式描述的工具,它使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在编程语言和文本编辑器中,正则表达式被广泛用于搜索、替换符合某个模式的文本。简单理解就是给了我们一个模板,然后根据这个模版来操作另外的字符串,进行匹配、替换等操作。
正则表达式的组成
既然我们说正则表达式是提供了一个模版,那这个模板是随便可以使用任意字符组成吗?肯定是不行的,其组成部分肯定也是有特殊的规定。组成模版的字符串除了正常使用的字符之外,还有另外一些特殊的字符。
元字符
元字符是具有特殊意义的专用字符。简单理解就是 有一些字符在正则表达式中被赋予了一些特殊的作用,并起名叫 "元字符"。下面我们来看常见的元字符。
| 元字符种类 | 描述说明 |
| ^ | 表示匹配的开始 |
| $ | 表示匹配的结束 |
| . | 匹配任意字符 (除\n) |
| \w | 匹配字母、数字、下划线 |
| \W | 匹配非 字母、数字、下划线 |
| \s | 匹配任意空白字符(\n、\t 等) |
| \S | 匹配任意非空白字符 |
| \d | 匹配任意十进制数(也就是0~9) |
注意:可能有小伙伴不是很理解 "匹配" 这个词,这个词和 "寻找" 的意思差不多。匹配成功,就是成功找到了;匹配失败,就是没有找到。对于匹配成功之后,会发生什么,后续在解释。
限定符
限定符 是用来限定匹配的次数,也就是当一个字符反复出现时,我们不想全部都匹配只想匹配其中的三个或者四个子类的。
| 限定符种类 | 描述说明 |
| ? | 匹配前面的字符0次或1次 |
| + | 匹配前面的字符1次或多次 |
| * | 匹配前面的字符0次或多次 |
| {n} | 匹配前面的字符n次 |
| {n, } | 匹配前面的字符最少n次 |
| {n, m} | 匹配前面的字符最小n次,最多m次 |
注意:限定符必须有前缀字符,也就是表明其要限制的字符是谁。例如,'\w?' 这个字符串如果作为模版的话,就是在匹配一个字符串时,即使该字符串由很多个 字母、数字、下划线 组成,那最多也就能成功匹配一个。(匹配的结果暂时不管)
其他字符
| 其他字符 | 描述说明 |
| 区间字符:[ ] | 匹配[ ]中所指定的字符 |
| 排除字符:^ | 匹配不在[ ]内的指定字符 |
| 选择字符:| | 匹配 "|" 左右的任意字符 |
| 转义字符 | 与Python中的转义字符是一样的 |
| [\u4e00 - \u9fa5] | 匹配任意一个汉字(日常生活中基本都涵盖) |
| 分组:() | 改变限定符的作用 |
详细解释:
1、 区间字符:[ ],匹配过程中,当遇到 [ ] 内的字符时,就会匹配成功。
2、排除字符:^,这其实就是 区间字符 的取反,匹配过程中,遇到 [ ] 内不存在的字符时,就会匹配成功。区间字符与排除字符经常是一起出现的,因为排除字符是基于区间字符的。但排除字符是存在于区间字符之内的。
3、选择字符:|,这个与Python中的 or 操作符类似,只要满足其中一个条件即可。但不存在类似于"短路"的现象。
4、转义字符就是我们在刚开始学习Python时,学习的转义字符。例如,. 这个字符是元字符的一种,但是加上 \ 之后,这个 "." 就是一个普通字符了。
5、[\u4e00-\u9fa5]:在匹配字符的过程中,如果遇到了 某些字符对应的Unicode码值 在 上述的范围之内,就表明这个是 中文字符,且匹配成功了。
6、分组():这个就类似于 圆括号 对于 操作符的作用,可以实现运算的先后顺序,这里是实现匹配的先后顺序。例如,six l fourth,只能匹配到 six 与 fourth,但是如果加上(),就会变得不一样,( six | four ) th,这里能匹配的就是 sixth 或者 fourth了。相当于是先运算括号内的,在去运算括号外的(这里的就是括号里面的任选一个,括号外边的全部起作用),与操作符是类似的。
正则表达式的使用
在Python中,如果要使用正则表达式的话,需要导入 re 模块。模块与包的概念是类似的,都是为了实现对某些代码的复用,这是面向对象的重要特征之一:封装。可能有的小伙伴第一门编程语言就是接触的Python,暂时还不了解这些概念,没关系,后面我们会接着学习的。我们只需要知道简单的将模块看成包就行了。
正则表达式的常见操作方法
当我们导入 re 模块之后,就可以进行正则表达式的相关操作了,但具体的操作,还得使用该模块中的方法,接下来详细来学习一下。
| 方法 | 描述说明 |
| re.match(pattern,string,flags=0) | 用于从字符串的开始位置进行匹配,如果起始位置匹配成功,结果为Match对象,否则结果为None。 |
| re.search(pattern,string,flags=0) | 用于在整个字符串中搜索第一个匹配的值,如果匹配成功,结果为Match对象,否则结果为None。 |
| re.findall(pattern,string,flags=0) | 用于在整个字符串搜索所有符合正则表达式的值,结果是一个列表类型。 |
| re.sub (pattern,repl,string,count,flags=0) | 用于实现对字符串中指定子串的替换 |
| re.split(pattern,string,maxsplit,flags=0) | 字符串中的split()方法功能相同,都是分隔字符串的 |
注意:
1、上述方法的所有pattern、string参数均为字符串类型,pattern 是模块字符串(定义匹配规则的),string 是待匹配的字符串(需要匹配的字符串)。flags=0 是可选参数,用于指定使用正则表达式时的匹配模式,如忽略大小写、多行匹配等。如果不需要特殊匹配模式,可以省略这个参数或者设置为0。我们一般都是直接忽略的。
2、match方法是用来匹配string的起始位置的,一旦起始位置匹配失败的话,即使后面存在可以匹配成功的子串,也会忽略,直接返回None。
3、re.sub() 方法中,repl 是替换字符串或者一个函数 。如果 repl 是一个函数,那么这个函数会被调用,传入每个匹配对象,返回值将用于替换匹配到的文本。count 是一个可选参数,指定了模式匹配后替换的最大次数。如果设置为 0,则所有匹配都会被替换。如果设置为一个正整数,则只替换前 count 次匹配
4、re.split() 方法中,maxsplit 这是一个可选参数,指定了分割的最大次数。
下面就来演示上述方法的使用。
match方法的使用:
import re# 这里的r是代表当前字符串中的转义字符是不能其作用的
# 例如,普通字符串:'\d' -> 表示是十进制的数字
# r普通字符串:r'\d' -> 表示两个字符 \ 与 d
pattern = r'hello'
string1 = 'hello world'
string2 = '123 hello world'# match方法代表是从字符串的开始位置匹配
# string1的开始位置是包含hello的,可以匹配成功,因此match1返回一个Match对象
# string2的开始位置是不包含hello的,匹配失败,因此match2返回None
match1 = re.match(pattern, string1)
match2 = re.match(pattern, string2)print(match1)
print(match2)
运行结果:

匹配成功会返回一个Match对象,如果我们想要将 Match对象其中的某些部分给单独拿出来的话,就可以使用下面的方法:
print(match1.re) # 输出正则表达式
print(match1.string) # 输出待匹配的字符串
print(match1.group()) # 输出匹配成功的字符串
print(match1.span()) # 输出匹配成功的字符串的索引范围
运行结果:

search方法的使用
import repattern = r'hello'
string1 = 'hello world'
string2 = '123 hello world'# search方法是在整个字符串中去匹配
# string1 与 string2 都是包含hello的,因此都可以匹配成功
match1 = re.search(pattern, string1)
match2 = re.search(pattern, string2)print(match1)
print(match2)
运行结果:

findall方法的使用
import repattern = r'hello'
string1 = 'hello world--hello python'
string2 = '123 hello world--hello python'# findall方法也是在整个字符串中去匹配,但是它会匹配所有的结果,并返回一个列表
# string1 与 string2 都是包含hello的,因此都可以匹配成功
match1 = re.findall(pattern, string1)
match2 = re.findall(pattern, string2)print(match1)
print(match2)
运行结果:

sub方法的使用
import repattern = r'hello'
string1 = 'hello world--hello python'
string2 = '123 hello world--hello python'# sub方法是替换字符串中的匹配项
# 将string1与string2中的pattern部分替换为'I love'
match1 = re.sub(pattern, 'I love',string1)
match2 = re.sub(pattern, 'I love',string2)print(match1)
print(match2)
运行结果:

split方法的使用
import repattern = r'--'
string1 = 'hello world--hello python'
string2 = '123 hello world--hello python'
string3 = '123 hello world hello python'# split方法是按照pattern分割字符串,并返回一个列表
# string1 与 string2 都是包含--的,因此都可以分割成功
match1 = re.split(pattern, string1)
match2 = re.split(pattern, string2)
# string3 没有--,因此无法分割成功,但是最终的结果还是一个列表
match3 = re.split(pattern, string3)print(match1)
print(match2)
print(match3)
运行结果:

上面代码都是对上述方法的一个简单使用,具体还有一些细节这里也就不再演示,大家可以自己去编写代码实践。
视频代码解读
下面是关于 Python子木 up主的视频中一些可能有困惑的地方解释。
章节选择题

章节实战
1、使用列表存储一些商品数据,使用循环遍历输出商品信息,要求对商品的编号进行格式化为6位,单价保留2位小数,并在前面添加人民币符号输出。
运行效果:

思路:直接将数据存储到列表中,然后我们直接去遍历列表即可。但是这里的难点就是这么样格式化输出这些数据。
如果将 编号这些数据头也存储在列表中的话,有两点不合适的地方:1、列表是用来存储有效数据的,如果存着编号这些数据有点别扭,并且在后面处理的时候还要额外判断,十分麻烦;2、无法实现对齐输出。因此我们是先将数据头在最开始的地方输出。接着就是要将编号与单价按照要求格式化。最简单也是最暴力的方式,将对应位置的数据全部拿出来,直接进行修改。例如,在编号数据前面加上四个零即可;在单价前面加上 ¥,然后再对数据 .2f 的输出即可。
代码实现:
goods = [['01', '电风扇', '美的', 500],['02', '洗衣机', 'TCL', 1000],['03', '微波炉', '老板', 400]]
print('编号\t\t名称\t\t\t品牌\t\t单价')
# 遍历列表
for item in goods: # item是一个一维列表for j in item:print(j,end='\t\t')print()
# 在上述基础上,进行暴力的格式化操作即可
for item in goods: # item是一个一维列表# item[0] 是编号,item[3]是单价item[0] = '0000'+item[0]# 注意这里操作的单价要是int或float类型,而不能是字符串item[3] = '¥{0:.2f}'.format(item[3])print('编号\t\t\t名称\t\t\t品牌\t\t单价')
for item in goods: # item是一个一维列表for j in item:print(j,end='\t\t')print()
好啦!本期 初始Python篇(7)—— 正则表达式 的学习之旅 就到此结束啦!我们下一期再一起学习吧!
相关文章:
初始Python篇(7)—— 正则表达式
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: Python 目录 正则表达式的概念 正则表达式的组成 元字符 限定符 其他字符 正则表达式的使用 正则表达式的常见操作方法 match方法的…...
洛谷P1443 马的遍历
简单的bfs 题目链接 P1443 马的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 有一个 nm 的棋盘,在某个点(x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。 输入格式 输入只有一行四个整数,分别为 n…...
代理IP地址的含义与设置指南
在数字化时代,互联网已经成为我们日常生活不可或缺的一部分。然而,在享受互联网带来的便利的同时,我们也面临着隐私泄露、访问限制等问题。代理IP地址作为一种有效的网络工具,能够帮助我们解决这些问题。本文将详细介绍代理IP地址…...
Vue--------导航守卫(全局,组件,路由独享)
全局导航守卫 beforeEach 全局前置守卫 afterEach 全局后置守卫 路由独享守卫 beforeEnter 路由独享守卫 组件导航守卫 beforeRouteEnter 进入组件前 beforeRouteUpdate 路由改变但是组件复调用 beforeRouteLeave 离开组件之前 执行顺…...
ElasticSearch7.x入门教程之全文搜索(七)
文章目录 前言一、多条件查询:bool query二、更加精准查询:dis_max query总结 前言 这里再接着上一篇文章继续记录。非常感谢江南一点雨松哥的文章。 欢迎大家去查看,地址:http://www.javaboy.org 一、多条件查询:boo…...
Adversarial Learning forSemi-Supervised Semantic Segmentation
首先来了解一下对抗学习: 对抗样本:将真实的样本添加扰动而合成的新样本,是由深度神经网络的输入的数据和人工精心设计好的噪声合成得到的,但它不会被人类视觉系统识别错误。然而在对抗数据面前,深度神经网络却是脆弱…...
UCOS-II 自学笔记
摘抄于大学期间记录在QQ空间的一篇自学笔记,当前清理空间,本来想直接删除掉的,但是感觉有些舍不得,因此先搬移过来。 一、UC/OS_II体系结构 二、UC/OS_II中的任务 1、任务的基本概念 在UCOS-II中,通常把一个大型任…...
C++ - 二叉搜索树讲解
二叉搜索树概念和定义 二叉搜索树是一个二叉树,其中每个节点的值都满足以下条件: 节点的左子树只包含小于当前节点值的节点。节点的右子树只包含大于当前节点值的节点。左右子树也必须是二叉搜索树。 二叉树搜索树性质 从上面的二叉搜索树定义中可以了…...
基于开源云原生数据仓库 ByConity 体验多种数据分析场景
基于开源云原生数据仓库 ByConity 体验多种数据分析场景 业务背景什么是 ByConity上手实测环境要求测试操作远程登录 ECS 服务器windows10 自带连接工具 执行查询 ByConity 相对于 ELT 能力的优化提升并行度任务级重试并行写入简化数据链路 业务背景 大家都知道,在…...
RabbitMQ 消息确认机制
RabbitMQ 消息确认机制 本文总结了RabbitMQ消息发送过程中的一些代码片段,详细分析了回调函数和发布确认机制的实现,以提高消息传递的可靠性。 返回回调机制的代码分析 主要用途 这个代码主要用于设置RabbitMQ消息发送过程中的回调函数,即…...
Node.js:开发和生产之间的区别
Node.js 中的开发和生产没有区别,即,你无需应用任何特定设置即可使 Node.js 在生产配置中工作。但是,npm 注册表中的一些库会识别使用 NODE_ENV 变量并将其默认为 development 设置。始终在设置了 NODE_ENVproduction 的情况下运行 Node.js。…...
【QT】背景,安装和介绍
TOC 目录 背景 GUI技术 QT的安装 使用流程 QT程序介绍 main.cpp编辑 Wiget.h Widget.cpp form file .pro文件 临时文件 C作为一门比较古老的语言,在人们的认知里始终是以底层,复杂和高性能著称,所以在很多高性能需求的场景之下…...
从0到1搭建webpack
好,上一篇文章我们说了一下在react中怎么弄这个webpack,那么现在在说一下不用react我们又该怎么配置,这些呢也都是我自己通弄过看视频自己总结的,拿来给大家分享一下。 前期准备条件 1、nvm(可以快速切换node版本&am…...
针对解决conda环境BUG的个人笔记
1-conda学习&安装 安装视频: 零基础教程:基于Anaconda和PyCharm配置Pytorch环境_哔哩哔哩_bilibili 安装过程: MX250笔记本安装Pytorch、CUDA和cuDNN-CSDN博客 Win10MX250CUDA10.1cuDNNPytorch1.4安装测试全过程(吐血)_nvidia geforc…...
读《Effective Java》笔记 - 条目13
条目13:谨慎重写clone方法 浅拷贝和深拷贝 浅拷贝(Shallow Copy) 浅拷贝 只复制对象本身,而不复制对象引用的成员。 对于引用类型的字段,浅拷贝会将原对象的引用复制到新对象中,而不会创建新对象实例。因…...
SQL 之连接查询
SQL 连接查询:深入理解 JOIN 操作 在数据库管理中,连接查询(JOIN)是一种基本而强大的操作,它允许我们从两个或多个表中检索数据。SQL 中的 JOIN 操作使得数据整合变得简单,这对于数据分析和报告至关重要。…...
vscode切换anaconda虚拟环境解释器不成功
问题: 切换解释器之后运行代码还是使用的原来的解释器 可以看到,我已经切换了“nlp”解释器,我的nltk包只在“nlp”环境下安装了,但是运行代码依然是"torch"解释器,所以找不到“nltk”包。 在网上找了各种…...
一个实用的 Maven localRepository 工具
目录 1 现状2 当前解决3 更好的解决3.1 下载 Maven localRepository 工具包3.2 上传本地 localRepository 包3.3 清理 localRepository 中指定后缀的文件 1 现状 在使用 Maven 时,我们可能会经常与本地仓库和私服仓库打交道。 例如对于本地仓库,因为某…...
目标检测,图像分割,超分辨率重建
目标检测和图像分割 目标检测和图像分割是计算机视觉中的两个不同任务,它们的输出形式也有所不同。下面我将分别介绍这两个任务的输出。图像分割又可以分为:语义分割、实例分割、全景分割。 语义分割(Semantic Segmentation)&…...
微信小程序 城市点击后跳转 并首页显示被点击城市
在微信小程序中,渲染出城市列表后,如何点击城市,就跳转回到首页,并在首页显示所点击的城市呢? 目录 一、定义点击城市的事件 二、首页的处理 首页:点击成都市会跳转到城市列表 城市列表:点击…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
