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 = '''aesdf13811011234
    aa1a3hi233rhi3
    87156340
    affa124564531346546
    afa19454132135'''
# 这里我们不说的过于复杂了,也不说特殊号码了,简单了解一下规则
# 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 = '''
    aesdf13811011234
    aa1a3hi233rhi3
    87156340
    affa124564531346546
    afa19454132135'''
>>> 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"

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【深度好文】合作伙伴关系管理自动化:双向共赢新趋势

在当今快速变化的商业环境中&#xff0c;合作伙伴关系已成为企业成功的关键因素之一。为了更高效地管理这些关系&#xff0c;合作伙伴关系管理自动化正逐渐成为行业的新趋势&#xff0c;它不仅简化了管理流程&#xff0c;更促进了双方共赢的局面。 一、传统管理 VS 自动化管理 …

Spring系列二:基于XML配置bean 下

基于XML配置bean &#x1f496;配置bean后置处理器&#x1f496;通过属性文件配置bean&#x1f496;基于XML的bean的自动装配&#x1f496;Spring El 表达式配置Bean &#x1f496;配置bean后置处理器 1在spring的ioc容器, 可以配置bean的后置处理器 2.该 处理器/对象 会在bean…

【AI大模型】通义灵码的部署与使用

【AI大模型】通义灵码的部署与使用 目前已支持&#xff1a; JetBrains IDEsIDE 版本&#xff1a;IntelliJ IDEA、PyCharm、GoLand、WebStorm、Android Studio 等 2020.3 及以上操作系统&#xff1a;Windows 7 及以上、macOS、LinuxVisual Studio CodeIDE 版本&#xff1a;1.68.…

常见网页问题解决

用edge浏览器打印功能时&#xff0c;出现瞬间或加载几秒后突然闪退情况&#xff0c;本来以为是浏览器出了问题&#xff0c;去重置设置也没有&#xff0c;后来又下载了Chrome浏览器&#xff0c;没想到还是一样&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;想着…

亿发512版本更新,看数据驾驶舱、扫码拣货、UDI序列号的新功能

如果您正寻求突破传统业务模式的束缚&#xff0c;希望拥抱数字化转型带来的无限可能&#xff0c;我们诚邀您体验亿发软件。亿发专业团队将为您提供个性化的咨询和定制服务&#xff0c;帮助您的企业快速适应市场变化&#xff0c;实现业务模式和商业模式的创新。

07-7.5.1 散列表的基本概念

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…

Centos7下zabbix安装与部署

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

2024最新版pycharm安装激火教程,附安装包+激huo马,Python教程,pycharm安装包!!

PyCharm的安装 PyCharm 是一个专门为 Python 开发者设计的 IDE&#xff0c;它同样具有代码导航、重构、调试和分析等功能。PyCharm 支持多种项目类型&#xff0c;如普通项目、Python 测试项目、Django 项目等&#xff0c;并提供了大量的内置模板和插件&#xff0c;以帮助您更快…

【CT】LeetCode手撕—8. 字符串转换整数 (atoi)

目录 题目1- 思路2- 实现⭐8. 字符串转换整数 (atoi)——题解思路 3- ACM 实现 题目 原题连接&#xff1a;8. 字符串转换整数 (atoi) 1- 思路 思路 x 的平方根 ——> 利用二分 ——> 二分的 check条件为 k^2 < x 2- 实现 ⭐8. 字符串转换整数 (atoi)——题解思路 …

响应式建站公司企业官网源码系统 带源代码以及搭建部署教程

系统概述 响应式建站公司企业官网源码系统是一套集设计、开发、部署于一体的综合性解决方案。它旨在为企业提供一个易于定制、功能强大、适应各种设备屏幕的官方网站平台。 该系统采用先进的技术架构&#xff0c;确保网站的稳定性和性能。它能够与各种后端数据库和服务器环境…

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

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

Nodejs 第八十六章(部署pm2)

Node.js如何部署? 如果要部署Nodejs项目&#xff0c;第一点肯定是需要有台服务器&#xff0c;第二点需要一个部署工具这里使用pm2 PM2 PM2 是一个非常流行的 Node.js 进程管理工具&#xff0c;用于在生产环境中运行和监控 Node.js 应用程序。它提供了多种功能&#xff0c;帮…

解决antd modal+Form 一起用,第二次打开会显示上次输入数据的问题

问题描述 在antd中使用<Modal/>包裹<Form/>时, 第二次打开<Modal/>会自动带入上一次输入的内容。 如下&#xff0c;第一次打开&#xff1a; 第二次打开&#xff1a; 解决办法 给<Modal/>组件添加属性&#xff1a;destroyOnClose{true}&#xff0c…

[RK3308H_Linux] 关于8+2(8路模拟麦克风 + 2路es7243e回采)的调试心得

问题描述 RK3308H 使用8路个模拟麦克风录音&#xff0c;2路用es7243e做回采 解决方案&#xff1a; 首先先调8路模拟麦克风&#xff0c;根据原理图确定使用的是哪路I2S。 以下为dts配置&#xff0c;acodec的属性注释附上。 &acodec {status "okay";rockchip,m…

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

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

【后端开发实习】用Nodejs操作mongodb结合Mongoose实现数据库操作

用Nodejs操作mongodb结合Schema实现数据库操作 Mongoose创建Schema定义Schema对象并映射到数据库Model的使用创建文档内容删除文档内容修改文档内容查询文档内容 Document的使用创建并保存将文档对象转换为JSON对象 模块化数据库连接模型初始化 项目部署路由定义后端操作定义启…

探索大模型:袋鼠云在 Text To SQL 上的实践与优化

Text To SQL 指的是将自然语言转化为能够在关系型数据库中执行的结构化查询语言&#xff08;简称 SQL&#xff09;。近年来&#xff0c;伴随人工智能大模型技术的不断进步&#xff0c;Text To SQL 任务的成功率显著提升&#xff0c;这得益于大模型的推理、理解以及指令遵循等能…

智能未来已来:纷享AI携手企业共赴AI+CRM新征途

大模型的风潮席卷各类型应用&#xff0c;“AI CRM”的概念并不算新&#xff0c;但真正好用、能用在业务流程中的AI工具并不多&#xff0c;而客户关系和旅程的复杂性不断变化&#xff0c;业务团队的压力不断增加&#xff0c;买家期望不断增高&#xff0c;这些都在推动CRM的人工智…

在Ubuntu下安装samba实现和Windows系统文件共享

一、安装 apt install -y samba samba-clientSamba is not being run as an AD Domain Controller: Masking samba-ad-dc.service Please ignore the following error about deb-systemd-helper not finding those services. (samba-ad-dc.service masked) Created symlink /et…