Python高级(三)_正则表达式

Python高级-正则表达式

第三章 正则表达式

在开发中会有大量的字符串处理工作,其中经常会涉及到字符串格式的校验。

1、正则表达式概述

正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。

2、re模块

一个正则表达式(或RE)指定了一集与之匹配的字符串;模块内的函数可以让你检查某个字符串是否跟给定的正则表达式匹配模块定义了几个函数,常量,和一个例外。有些函数是编译后的正则表达式方法的简化版本(少了一些特性)。绝大部分重要的应用,总是会先将正则表达式编译,之后在进行操作

那现在我们先熟悉re模块的一简单的方法

compile方法
re.compile(pattern[,flags])
# 作用:把正则表达式语法转化成正则表达式对象
pattern:正则表达式语法
flags定义匹配模式包括:{
re.I:忽略大小写
re.L:表示特殊字符集 \w,\W,\b,\B,\s,\S 依赖于当前环境
re.M:多行模式
re.S:' . '并且包括换行符在内的任意字符(注意:' . '匹配任意字符但不包 括换行符)
re.U:表示特殊字符集 \w,\d,\D,\S 依赖于 Unicode 字符属性数据库
}
search方法
re.search(pattern, string[, flags=0])
# 作用:扫描整个字符串,并返回第一个成功的匹配。如果匹配失败,则返回None。
pattern : 正则表达式对象
string : 要被查找替换的原始字符串。
flags定义匹配模式包括:{
re.I:忽略大小写
re.L:表示特殊字符集 \w,\W,\b,\B,\s,\S 依赖于当前环境
re.M:多行模式
re.S:' . '并且包括换行符在内的任意字符(注意:' . '匹配任意字符但不包括换行符)
re.U:表示特殊字符集 \w,\d,\D,\S 依赖于 Unicode 字符属性数据库
}
match方法
re.match(pattern, string[, flags=0])
# 作用:从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
pattern : 正则表达式对象
string : 需要匹配的字符串
flags定义匹配模式包括:{
re.I:忽略大小写
re.L:表示特殊字符集 \w,\W,\b,\B,\s,\S 依赖于当前环境
re.M:多行模式
re.S:' . '并且包括换行符在内的任意字符(注意:' . '匹配任意字符但不包括换行符)
re.U:表示特殊字符集 \w,\d,\D,\S 依赖于 Unicode 字符属性数据库
}

这里我们分别简单了解一下这些模块,

1、compile方法是将正则表达式转换成对象,

2、search和match方法是根据compile对象转换生成好的规则,进行匹配。

那我们将上方的思考题拿下来,先看思考一下

# 导入模块
>>> import re
# 如何判断一个字符串是手机号呢
tel_1 = '''aesdf13811011234aa1a3hi233rhi387156340affa124564531346546afa19454132135'''
# 这里我们不说的过于复杂了,也不说特殊号码了,简单了解一下规则
# 1、由11位正整数字组成
# 2、第一位数字必须由1开头,第二位数字由3-9组成
# 根据这些条件这里即可以生成一个匹配式 1[3,9]\d{9},下面我们会讲解上匹配语法与规则
pattern = re.compile(r'1[3,9]\d{9}')
# 使用search方法,匹配到一个电话号码
print(re.search(pattern, tel_1))#<re.Match object; span=(7, 18), match='13811011234'>
# 再使用match方法,输出了None
print(re.match(pattern, tel_1))
None# -----------------------------------------------# 那我们换一个例子再看,
tel_2 = '''19454132135abuw'''
# 再将匹配表达式转换成匹配对象
pattern = re.compile(r'1[3,9]\d{9}')
# 先使用search方法
print(re.search(pattern, tel_2))
#<re.Match object; span=(0, 11), match='19454132135'>
# 再使用match方法,看到对象响应的结果,出现了需要匹配的号码
print(re.match(pattern, tel_2))
#<re.Match object; span=(0, 11), match='19454132135'>

我们可以发现,更多的时候,我们在字符串或者是一堆单词内容里面不确定范围搜索,可以使用search来进行匹配第一个最先匹配到的正常的电话号码,而match用来匹配第一个注意是第一个字符的,这里的第一个是在被搜索的这串字符的第一位索引上的

这里面我们根据返回回来的内容,看到有三部分

1、re.Match object 对象
2、span=()搜索结果在文本索引位置
3、match匹配结果

这里我们现在就需要急切了解到两个问题

第一、得到的匹配对象re.Match object该如何处理,以及re模块是否存在一些其他的方法

第二、正则表达式的写法

3、Match对象

我们来看一下,Match对象,Match对象是一次匹配的结果,包含匹配的很多信息

Match匹配对象的属性
在这里插入图片描述

>>> import re
>>> tel_1 = '''aesdf13811011234aa1a3hi233rhi387156340affa124564531346546afa19454132135'''
>>> pattern = re.compile(r'1[3,9]\d{9}')
>>> results = re.search(pattern, tel_1)
# pos表示搜索的开始的位置,endpos搜索结束的位置
>>> print(results.pos, results.endpos)
0 83
# group表示匹配的结果
>>> print(results.group())
13811011234
>>> tel_2 = '''19454132135abuw'''
>>> results = re.search(pattern, tel_2)
# pos表示搜索的开始的位置,endpos搜索结束的位置
>>> print(results.pos, results.endpos)
0 15
# group表示匹配的结果
>>> print(results.group())
19454132135>>> results = re.search(pattern, tel_2)
# pos表示搜索的开始的位置,endpos搜索结束的位置
>>> print(results.pos, results.endpos)
0 15
# group表示匹配的结果
>>> print(results.group())
19454132135

4、正则表达式

构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。

正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配元字符 (参见 python 模块 [re 文档](re — 正则表达式操作 — Python 3.12.4 文档))

字符功能
.匹配任意字符(不包括换行符)
A匹配开始位置,多行模式下匹配每一行的开始,(也有取反的意思,区分应用场景)
$匹配结束位置,多行模式下匹配每一行的结束
*匹配前一个元字符0到多次
匹配前一个元字符1到多次
?匹配前一个元字符0到1次
{m,n}匹配前一个元字符m到n
\转义字符,跟在其后的字符将失去作为特殊元字符的含义,
例如.只能匹配.,不能再匹配任意字符
[]字符集, 一个字符的集合,可匹配其中任意一个字符
|逻辑表达式或,比如a
(…)分组,默认为捕获,即被分组的内容可以被单独取出,

默认每个分组有个索引,从1开始,按照"("的顺序决定索引值
(?iLmsux)分组中可以设置模式,iLmsux之中的每个字符代表一个模式
(?:…)分组的不捕获模式,计算索引时会跳过这个分组
(?P…)分组的命名模式,取此分组中的内容时可以使用索引也可以使用name
(?P=name)分组的引用模式,可在同一个正则表达式用引用前面命名过的正则
(?#…)注释,不影响正则表达式其它部分
(?=…)顺序肯定环视,表示所在位置右侧能够匹配括号内正则
(?!..)顺序否定环视,表示所在位置右侧不能匹配括号内正则
(?<=…)逆序肯定环视,表示所在位置左侧能够匹配括号内正则
(?<!..)逆序否定环视,表示所在位置左侧不能匹配括号内正则
(?(id/name)yes|no)若前面指定id或name的分区匹配成功则执行yes处的正则,否则执行no处的正则
\number匹配和前面索引为number的分组捕获到的内容一样的字符串
VA匹配字符串开始位置,忽略多行模式
\Z匹配字符串结束位置,忽略多行模式
\b匹配位于单词开始或结束位置的空字符串
\B匹配不位于单词开始或结束位置的空字符串
\d匹配一个数字,相当于[0-9]
\D匹配非数字,相当于[^0-9]
\s匹配任意空白字符,相当于[\t\n\r\fv]
\S匹配非空白字符,相当于[^\t\n\r\flv]
\w匹配数字、字母、下划线中任意一个字符,相当于[a-zA-Z0-9]
\W匹配非数字、字母、下划线中的任意字符,相当于-[^\w]

5、表示字符

在这里插入图片描述

’ . ’ 用法
# 导入模块
>>> import re
# 测试匹配任意字符(不包括换行符)使用的re中的match方法
>>> print(re.match(".","a").group())
'a'
>>> print(re.match(".","1").group())
'1'
>>> print(re.match(".","_").group())
'_'
>>> print(re.match(".","0").group())
'0'
# 只有匹配到'\n'时候提示None,说明,匹配任意字符(不包括换行符)
>>> print(re.match(".","\n"))
None
’ [ ] ’ 用法
# 导入模块
>>> import re
# 匹配字符集,区间中的集合,可匹配其中任意一个字符,使用的re中的match方法
# 如果hello的首字符小写,那么正则表达式需要小写的h
>>> print(re.match("h","hello Python").group())
'h'
# 如果hello的首字符大写,那么正则表达式需要大写的H
>>> print(re.match("H","Hello Python").group())
'H'
# 大小写h都可以的情况
>>> print(re.match("[hH]","hello Python").group())
'h'
>>> print(re.match("[hH]","Hello Python"

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

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

相关文章

PostgreSql中的JSON数据类型

PostgreSQL 提供了两种 JSON 数据类型&#xff1a;JSON 以及 JSONB。这两种类型主要的区别在于数据存储格式&#xff0c;JSONB 使用二进制格式存储数据&#xff0c;更易于处理。 PostgreSQL 推荐优先选择 JSONB 数据类型。 两种数据类型之间的区别&#xff1a; 功能JSONJSONB存…

网络建设与运维23国赛网络运维正式赛题解析

竞赛环境请看主页&#xff01; 23国赛网络运维 任务描述&#xff1a;某集团公司在更新设备后&#xff0c;路由之间无法正常通信&#xff0c;请修 复网络达到正常通信。 &#xff08;1&#xff09; 请在server1“管理员”下拉菜单中选择“镜像”选项卡&#xff0c;点 击 “创…

超声波眼镜清洗机有用吗?四大主流超声波清洗机品牌整理测评

长期佩戴的眼镜&#xff0c;若不定期清洗&#xff0c;不仅镜片会逐渐积聚油脂、灰尘&#xff0c;影响透光率&#xff0c;使视物模糊&#xff0c;更严重的是&#xff0c;眼镜上日益增加的微小杂质和细菌可能会逐渐影响到眼睛健康&#xff0c;导致视力下降、眼部疾病等问题。 这…

Go 1.19.4 函数-Day 08

1. 函数概念和调用原理 1.1 基本介绍 函数是基本的代码块&#xff0c;用于执行一个任务。 Go 语言最少有个 main() 函数。 你可以通过函数来划分不同功能&#xff0c;逻辑上每个函数执行的是指定的任务。 函数声明告诉了编译器函数的名称&#xff0c;返回类型&#xff0c;和参…

STM32 - PWR 笔记

PWR&#xff08;Power Control&#xff09;电源控制 PWR 负责管理 STM32 内部的电源供电部分&#xff0c;可以实现 可编程电压监测器 和 低功耗模式 的功能 可编程电压监测器&#xff08;PVD&#xff09;可以监控VDD电源电压&#xff0c;当VDD下降到PVD阀值以下或上升到PVD…

usbserver工程师手记(三)手工开通 OTP功能

1、设定密钥&#xff0c;用户自行选择一个密钥&#xff0c;以下以密钥为 EAZAYOKNGETBOPC5 为例说明 2、usb server 配置otp 密钥&#xff0c;目前还没有UI 界面开通&#xff0c;后续版本会支持从管理界面开通 curl -X POST -H Content-Type: application/json -H Accept: app…

Centos7下zabbix安装与部署

Centos7下zabbix安装与部署 一、Zabbix介绍 1、zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案 2、zabbix能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各…

活动策划秘籍:如何让企业活动引爆市场?

作为一个活动策划&#xff0c;我的经验是&#xff0c;活动策划是一场精心编排的交响乐&#xff0c;每一个音符都要恰到好处。 想要做好企业活动策划工作的关键在于综合考虑多个方面&#xff0c;并确保每个环节的顺畅执行。 以下是7个关键要素&#xff0c;只要用心体会&#x…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【密钥派生(C/C++)】

密钥派生(C/C) 以HKDF256密钥为例&#xff0c;完成密钥派生。具体的场景介绍及支持的算法规格&#xff0c;请参考[密钥生成支持的算法]。 在CMake脚本中链接相关动态库 target_link_libraries(entry PUBLIC libhuks_ndk.z.so)开发步骤 生成密钥 指定密钥别名。 初始化密钥属…

通过电压差判定无源晶振是否起振正确吗?

在电子工程中&#xff0c;无源晶振作为许多数字电路的基础组件&#xff0c;其是否成功起振对于系统的正常运行至关重要。然而&#xff0c;通过简单检测晶振两端的电压差来判断晶振是否工作&#xff0c;这一方法存在一定的误区&#xff0c;晶发电子将深入探讨这一话题&#xff0…

2008年下半年软件设计师【下午题】真题及答案

文章目录 2008年下半年软件设计师下午题--真题2008年下半年软件设计师下午题--答案 2008年下半年软件设计师下午题–真题 2008年下半年软件设计师下午题–答案

四川赤橙宏海商务信息咨询有限公司抖音电商服务靠谱吗?

在数字化浪潮席卷全球的今天&#xff0c;电商行业蓬勃发展&#xff0c;各种新兴电商平台层出不穷。其中&#xff0c;抖音电商以其独特的社交属性和庞大的用户基础&#xff0c;迅速崛起为行业新星。四川赤橙宏海商务信息咨询有限公司&#xff0c;作为专注于抖音电商服务的佼佼者…

个人怎么交易现货黄金:加速形态

我们作为普通个人&#xff0c;在现货黄金市场中交易就需要掌握相应的现货黄金投资技巧。下面我们就来介绍一个&#xff0c;个人怎么交易现货黄金的形态——加速形态。 加速形态是用于判断市场趋势力竭的情况&#xff0c;这种趋势可以是上升&#xff0c;也可以是下跌。但是要注意…

用Qwt进行图表和数据可视化开发

目录 Qwt介绍 示例应用场景 典型QWT开发流程 举一些Qwt的例子&#xff0c;多绘制几种类型的图像 1. 绘制折线图 (Line Plot) 2. 绘制散点图 (Scatter Plot) 3. 绘制柱状图 (Bar Plot) 4. 绘制直方图 (Histogram) Qwt介绍 QWT开发主要涉及使用QWT库进行图表和数据可视化…

晋升业内新宠儿,MoE模型给了AI行业两条关键出路

文 | 智能相对论 作者 | 陈泊丞 今年以来&#xff0c;MoE模型成了AI行业的新宠儿。 一方面&#xff0c;越来越多的厂商在自家的闭源模型上采用了MoE架构。在海外&#xff0c;OpenAI的GPT-4、谷歌的Gemini、Mistral AI的Mistral、xAI的Grok-1等主流大模型都采用了MoE架构。 …

第三方配件也能适配苹果了,iOS 18与iPadOS 18将支持快速配对

苹果公司以其对用户体验的不懈追求和对创新技术的不断探索而闻名。随着iOS 18和iPadOS 18的发布&#xff0c;苹果再次证明了其在移动操作系统领域的领先地位。 最新系统版本中的一项引人注目的功能&#xff0c;便是对蓝牙和Wi-Fi配件的配对方式进行了重大改进&#xff0c;不仅…

python如何计算两个时间相差多少秒钟,分钟,小时,天,月,年

使用场景&#xff1a;在做上课记录系统的时候&#xff0c;有上课开始时间和上课结束时间&#xff0c;需要计算这两个时间的插值&#xff0c;以分钟为单位。 封装方法如下&#xff1a; from datetime import datetimedef sub_seconds(date1: str "2024-07-11 12:33:33&q…

【CORS 报错】跨域请求问题:CORS 多种环境下的解决方案

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、CORS错误的常见原因二、解决方案1. Vue3 Vite项目下的解决方案创建Vue3 Vite项目配置Vite的代理发送请求 2. jQuery项目下的解决方案使用CORS请求头使用JSONP 3. 其他环境下的解决方案使用服务器端代理设置CORS头使用…

PS拉框选择工具

Photoshop&#xff08;PS&#xff09;中的拉框选择工具&#xff0c;也称为选框工具&#xff0c;是图像处理中非常基础且强大的工具之一。它允许用户通过绘制矩形、椭圆形以及单行、单列的选择框来选定图像中的特定区域。本教程将详细介绍选框工具的使用方法、技巧及其属性设置。…

前端vue3 登录页面 响应式开发

一个登录页面 我直接上代码了 结构是这样的 Login 页面 <template><a-layout class"login-box"><a-layout-content class"login-content"><a-row align"middle" justify"center" class"login-content-ma…