Python案例|Pandas正则表达式

图片

字符串的处理在数据清洗中占比很大。也就是说,很多不规则的数据处理都是在对字符串进行处理。Excel提供了拆分、提取、查找和替换等对字符串处理的技术。在Pandas中同样提供了这些功能,并且在Pandas中还有正则表达式技术的加持,让其字符串处理能力更加强大。

01、正则

正则就是正则表达式(Regular Expression)的简称,它是一种强大的文本处理技术。正则表达式描述了字符串匹配的模式(Pattern),可以用来检查一个字符串是否含有某种子字符串,对匹配成功的字符串可以进行提取、拆分、查找和替换等处理。大部分的编程语言支持正则表达式,匹配规则也基本相同,但不同编程语言的处理方式略有不同。

在实际工作中,用户需要的多条有用信息很可能会混杂在一起,要将这些杂乱的数据整理规范,很可能就需要正则表达式的加持。在Pandas中提供的很多关于文本处理的函数支持正则表达式,所以在讲解Pandas的文本处理函数之前,首先要详细了解正则表达式技术。

1正则表达式的导入与创建

要在Python中使用正则表达式,首先要导入re库,它是Python的内置库,也就是说不需要用户安装; 接下来演示一下直接导入使用和通过编译后再使用两种方法。

1.直接导入使用

在导入re库之后,直接使用re.函数()的方式来使用正则表达式,例如使用re.findall()函数,示例代码如下:

import re  #导入正则表达式库
print (re.findall(r' d','9527') )  #直接调用正则表达式函数使用
print (re.findall(r' d','5201314'))  #直接调用正则表达式函数使用

 运行结果如下:

图片

2.通过编译使用

如果需要重复使用一个正则表达式对象,则可以将正则表达式预编译成正则表达式对象,这样效率更高。在导入re库后,将正则表达写入re.compile()函数,然后生成正则表达式对象,再调用这个对象中的函数进行处理,示例代码如下:

import re  #导入正则表达式库
pat=re.compile(r'\d') #使用 compile 函数生成正则表达式对象
print(pat.findall('5201314'))  #调用编译后的正则表达式对象中的函数使用 
print (pat.findall('9527') )   #调用编译后的正则表达式对象中的函数使用

 运行结果如下:

图片

 

预编译的方式也可以直接写成一条代码,如re.compile(r'\d').findall('9527')。不管正则表达式采用何种调用方式,始终脱离不了以下三要素。

(1) 正则表达式字符串。如r'\d',单引号中的字符串表明匹配规则,\d是查找单个数字的意思。

(2) 正则表达式被匹配的字符串。如'9527',对'9527'执行r'\d' 的匹配,意思就是查找'9527'中有多少个单数字。

(3) 匹配成功后的处理方式。例如调用findall()函数,表示如果匹配成功,则将查找出来的单个数字存储在列表中。

在上面的三要素中,需要重点学习正则表达式字符串的编写规则,以及匹配成功后的处理方式。

2正则表达式处理函数

本来应该先讲解正则表式的编写规则,但读者可能更希望正则表达式匹配成功后,能看到对应的处理结果,这样能有更直观的感受,所以本节先讲解正则表达式的常用函数。

本节在讲解正则表达式函数时,会分别讲解直接写法(re.函数())和预编译写法(regex.函数())两种形式,虽然这两种书写形式对应的函数名一样,功能也一样,但函数的参数略有差异。

在Python的正则表达式中,使用不同函数,其返回的数据类型也不一样,例如返回re.Match(匹配对象)、list(列表)、iterator(迭代器)、str(字符串)等,其中返回的re.Match匹配对象存储有更多信息。

1. 从开始位置匹配(match()函数)

如果希望从字符串的开始位置匹配,则可以使用match()函数。如果匹配成功,则match()函数返回的是一个re.Match匹配对象。

1) re.match()函数

re.match()函数的参数说明如下。

re.match(pattern, string, flags=0)

pattern: 匹配的正则表达式。

string: 要匹配的字符串。

flags: 标志位,用于控制正则表达式的匹配方式,见表1。

■ 表1 常见正则表达式flags的匹配模式

图片

re.match()函数的示例代码如下:

import re   #导入正则表达式库
print(re.match(r'apple','apple 苹果') ) #在'apple 苹果'字符串中以 apple'开头
print (re.match(r'苹果','apple 苹果'))  #在'apple 苹果,字符串中以,苹果'开头

 运行结果如下:

图片

2) regex.match()函数

regex.match()函数的参数说明如下。

regex.match(string[, pos[, endpos]])

string: 必选,被匹配的字符串。

pos: 可选,指定起始位置。

endpos: 可选,指定结束位置。

注意: regex为正则表达式对象的统称。

regex.match()函数的示例代码如下:

import re   #导入正则表达式库
print(re.compile(r'apple').match('apple 苹果'))  #在'apple 苹果'字符串中以apple'开头
print(re.compile(r'苹果') .match('apple 苹果'))  #在'apple 苹果,字符串中以,苹果"开头

 运行结果如下:

图片

通过运行结果发现,第1个测试匹配成功,返回re.Match对象,其中span=(0, 5)表示匹配成功的字符串的起止位置。第2个测试没有匹配成功,返回值为None。

还有一个与match()函数相似的fullmatch()函数,该函数完整匹配整个字符串。先演示一下re.fullmatch()函数,示例代码如下:

import re  #导入正则表达式库
print (re.fullmatch(r'apple 苹果',apple 苹果'))    #在 apple 苹果'字符串中匹配apple 苹果,
print (re.fullmatch (r'apple','apple 苹果') )       #在 apple 苹果,字符串中匹配
'apple'

 运行结果如下:

图片

接下来演示regex.fullmatch()函数,示例代码如下:

import re  #导入正则表达式库
print (re.compile(r'apple 苹果').fullmatch('apple 苹果')) #在'apple苹果'字符串中匹配'apple 苹果print(re.compile(r'apple') .fullmatch('apple 苹果'))  #在 apple 苹果'字符串中匹配'apple

 运行结果如下:

图片

通过上面的示例会发现,只有完整匹配了整个字符串,才能匹配成功,否则返回值为None,并且在示例中会发现,只有匹配的字符串与被匹配的字符串相等才可以成功。是不是匹配与被匹配的字符串一定要相等呢? 其实并非如此,可以写更复杂的正则表达式字符串,只要从开头到结尾都能匹配成功就可以。

2. 从任意位置匹配(search()函数)

match()函数必须从指定的起始位置开始匹配,如果希望从任意位置开始匹配,则可以使用search()函数。如果匹配成功,则返回re.Match配匹对象,否则返回值为None。

1) re.search()函数

re.search()函数的参数说明如下。

search(pattern, string, flags=0)

pattern: 匹配的正则表达式。

 

string: 要匹配的字符串。

flags: 标志位,用于控制正则表达式的匹配方式,见表6-1。

re.search()函数的示例代码如下:

import re  #导入正则表达式库
print (re.search(r'apple',3 个apple苹果')) #在3个apple 苹果'字符串中搜索apple"
print(re.search(r'apple',apple 苹果3 个')) #在3个apple 苹果'字符串中搜索apple"
print (re.search(r'梨子','apple 苹果3个')) #在'apple 苹果3 个1字符串中搜索'梨子

运行结果如下:

图片

2) regex.search()函数

regex.search()函数的参数说明如下。

regex.search(string[, pos[, endpos]])

string: 必选,被匹配的字符串。

pos: 可选,指定起始位置。

endpos: 可选,指定结束位置。

regex.search()函数的示例代码如下:

 

import re#导入正则表达式库
print(re.compile(r'apple').search('3 个apple苹果')) #在3个apple苹果'字符串中搜索'apple'
print(re.compile(r'apple').search('apple 苹果3个')) #在3个apple苹果'字符串中搜索'apple'
print(re.compile(r'梨子').search('apple 苹果3个')) #在apple苹果3 个1字符串中搜索,梨子|

运行结果如下:

图片

通过上面的示例会发现,只要被搜索的字符串包含要查找的字符串,最后都能匹配成功,并且返回re.Match对象。

注意: match()函数和search()函数在进行匹配时,可能有多个对象符合匹配要求,但只返回第1个匹配成功的re.Match对象。

3. 用列表存储匹配成功的值(findall()函数)

前面学习的match()函数和search()函数只返回第1次匹配成功的re.Match 对象,如果希望返回所有匹配成功的数据,则可以使用findall()函数,返回的结果是列表类型; 如果没有匹配成功,则返回空列表。

注意,findall()函数匹配出的数据只是从re.Match对象中提取出的信息之一。

1) re.findall()函数

re.findall()函数的参数说明如下。

re.findall(pattern,string,flags=0)

pattern: 匹配的正则表达式。

string: 要匹配的字符串。

flags: 标志位,用于控制正则表达式的匹配方式,见表1。

re.findall()函数的示例代码如下:

txt='张三2李四3 王五 4 陈小兵 15 大龙' #被匹配的字符串
print (re.findall(r' D+\d+',txt)) #常规匹配
print (re.findall(r'(\D+)\d+',txt))#添加 1 组括号
print (re.findall(r'(\D+) (\d+)',txt)) #添加 1组以上括号

 运行结果如下:

图片

2) regex.findall()函数

regex.findall()函数的参数说明如下。

regex.findall(string[, pos[, endpos]])

string: 待匹配的字符串。

pos: 可选参数,指定字符串的起始位置,默认值为0。

endpos: 可选参数,指定字符串的结束位置,默认值为字符串的长度。

regex.findall()函数的示例代码如下:

import re  #导入正则表达式库
txt='张三2李四3 王五 4 陈小兵 15 大龙'  #被匹配的字符串
print (re.compile(r'\D+\d+') .findall(txt))#添加 1 组括号
print (re.compile(r'(\D+) d+') .findall(txt)) #常规匹配
print(re.compile(r'(\D+) (\d+)').findall(txt)) #添加1组以上括号

 运行结果如下:

图片

通过上面的示例会发现,findall()函数如果没有分组,则直接返回匹配成功的所有字符串; 如果只有1个分组,则将分组中的值返回到列表; 如果多于1个分组,则列表中的每个元素是元组,元组中的元素就是每个分组中的值。

注意: findall()函数中的正则表达式字符是'\D+\d+ ',表示匹配连续的非数字和连续的数字,后面在讲解正则表达式元字符时,会详细讲解\D与\d。

4. 用迭代器存储匹配成功对象(finditer()函数)

finditer()函数与findall()函数的功能类似,其主要区别在于findall()函数匹配成功后返回的是列表,列表中存储的是匹配成功的数据; 而finditer()函数匹配成功后返回的是迭代器,迭代器中存储的是匹配成功的re.Match对象。

1) re.finditer()函数

re.finditer()函数的参数说明如下。

re.finditer(pattern, string, flags=0)

pattern: 匹配的正则表达式。

string: 要匹配的字符串。

flags: 标志位,用于控制正则表达式的匹配方式,见表1。

re.finditer()函数的示例代码如下:

import re  #导入正则表达式库
txt='张三2李四3 王五 4 陈小兵 15 大龙' #被匹配的字符串
print (re.finditer(r'\D+\d+',txt))  #常规匹配
print (re.finditer(r'( D+)\d+'txt))  #添加 1组括号
print (re.finditer(r'(\D+) (\d+)',txt)) :#添加 1 组以上括号

 运行结果如下:

图片

2) regex.finditer()函数

regex.finditer()函数的参数说明如下。

regex.finditer(string[, pos[, endpos]])

string: 待匹配的字符串。

pos: 可选参数,指定字符串的起始位置,默认值为 0。

endpos: 可选参数,指定字符串的结束位置,默认值为字符串的长度。

regex.finditer()函数的示例代码如下:

import re   #导入正则表达式库
txt='张三 2 李四3 王五 4 陈小兵 15 大龙' #被匹配的字符串
print (re.compile(r' D+ \d+') .finditer(txt))#常规匹配
print (re.compile(r'(\D+)\d+') .finditer(txt))print (re.compile(r'(\D+)  #添加 1 组括号(\d+)').finditer(txt)) #添加1组以上括号

 运行结果如下:

图片

通过上面的示例会发现,返回的是callable_iterator object(迭代器对象),迭代器中存储的是每个匹配成功的re.Macth对象。也就是说finditer()函数与findall()函数相比而言,能获取更多的信息。

finditer()函数匹配成功后,可以用循环语句读取迭代器中的数据,也可以用list()函数对迭代器进行转换,示例代码如下:

import re #导入正则表达式库
txt='张三2李四3 王五 4 陈小兵 15 大龙' #被匹配的字符串
print (list (re.compile(r'\D+\d+').finditer(txt))) #常规匹配

运行结果如下:

图片

观察运行结果可以发现,每次匹配成功后,返回的不是具体的值,而是re.Match对象。

02、文末送书

作为生产力工具,Python是当今极为流行的编程语言。Python编程逐渐成为一项通用能力,从小学生到各个行业的从业人员都在学Python。Python确实能够在很多领域发挥作用,以至于Python编程已经成为一些职业的加分项甚至必备能力。

市面上的Python书繁多,新入行的朋友问的最多的问题就是如何挑选一本好的入门书?这真是个让人很头疼的问题!

  • 知识点堆砌,杂而不精脱

  • 离实际开发需求详略

  • 设置不合理

  • 学习曲线过于陡峭

  • 案例过于炫技

  • 不注重学习过程和结果

以上是Python入门书的通病,今天推荐的这本《Python之光》,将重新定义Python学习:

图片

 参与方式:文章三连并评论“零基础学习Python,就用《Python之光》”参与抽奖,48小时后,评论区自动抽取5位幸运小伙伴每人送出1本(包邮到家哦)!

 

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

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

相关文章

TypeScript相关面试题

typeScript 1.什么是TypeScript?是什么?特性?区别? 2.TypeScript数据类型?3.说说你对 TypeScript 中枚举类型的理解?应用场景?4.说说你对 TypeScript 中接口的理解?应用场景?使用方…

docker中的jenkins之流水线构建

docker中的jenkins之流水线构建项目 1、用node这种方式(因为我用pipeline方式一直不执行,不知道为什么) 2、创建项目 创建两个参数,一个是宿主端口号,一个是docker中的端口号 3、使用git项目中的Jenkinsfile 4、编写…

【AGI】世界首次实现室温超导LK-99

论文:The First Room-Temperature Ambient-Pressure Superconductor GPT论文总结: 根据所提供的信息,这篇论文报道了一种在室温和常压下工作的室温超导体LK-99。LK-99的超导性是通过微小的结构畸变引起的,而不是通过温度和压力等外…

09 - 连续的多个commit整理成1个

查看所有文章链接:(更新中)GIT常用场景- 目录 文章目录 将连续的多个commit整理成1个 将连续的多个commit整理成1个 将anranxiaohunzhang和xianglongshibazhang合并起来(将anranxiaohunzhang合并到降龙十八掌上,生成新…

docker 学习--03 环境安装(本人使用的win10 Linux也是在win10下模拟)

docker 学习–03 环境安装(本人使用的win10 Linux也是在win10下模拟) docker 学习-- 01 基础知识 docker 学习-- 02 常用命令 文章目录 docker 学习--03 环境安装(本人使用的win10 Linux也是在win10下模拟)[TOC](文章目录) 1. wi…

【数学建模】逻辑回归算法(Logistic Resgression)

逻辑回归算法 简介逻辑回归与条件概率绘制sigmoid函数 简介 逻辑回归算法是一种简单但功能强大的二元线性分类算法。需要注意的是,尽管"逻辑回归"名字带有“回归”二字,但逻辑回归是一个分类算法,而不是回归算法。 我认为&#xff…

冉冉升起的星火,再度升级迎来2.0时代!

文章目录 前言权威性评测结果 星火大模型多模态功能插件功能简历生成文档问答PPT生成 代码能力 福利 前言 前几天从技术群里看到大家都在谈论《人工智能大模型体验报告2.0》里边的内容,抱着好奇和学习的态度把报告看了一遍。看完之后瞬间被里边提到的科大讯飞的星火…

2008-2020年全国各省绿色金融发展指数(含原始数据)

2008-2020年全国各省绿色金融发展指数(含原始数据) 1、时间:2008-2020年 2、范围:30个省市 不含西藏 3、来源:原始数据整理自csmar、eps、wind等数据库 4、原始数据指标: A股上市环保企业新增银行贷款…

企业服务器数据库遭到malox勒索病毒攻击后如何解决,勒索病毒解密

网络技术的发展不仅为企业带来了更高的效率,还为企业带来信息安全威胁,其中较为常见的就是勒索病毒攻击。近期,我们公司收到很多企业的求助,企业的服务器数据库遭到了malox勒索病毒攻击,导致系统内部的许多重要数据被加…

HCIP VRRP技术

一、VRRP概述 VRRP(Virtual Router Pedundancy Protocol)虚拟路由器冗余协议,既能够实现网关的备份,又能够解决多个网关之间互相冲突的问题,从而提高网络可靠性。 局域网中的用户的终端通常采用配置一个默认网关的形…

【uniapp】 软键盘弹出后fixed定位被顶上去问题

问题描述 当手机设计的导航栏为fixed定位上去时&#xff0c;输入框获取焦点就会把顶部自定义的导航栏顶到上面去&#xff0c;如下图所示 解决办法 输入框设置 :adjust-position“false” <input type"text" :adjust-position"false" focus"i…

AI绘画 | 一文学会Midjourney绘画,创作自己的AI作品(快速入门+参数介绍)

一、生成第一个AI图片 首先&#xff0c;生成将中文描述词翻译成英文 然后在输入端输入&#xff1a;/imagine prompt:Bravely running boy in Q version, cute head portrait 最后&#xff0c;稍等一会即可输出效果 说明&#xff1a; 下面的U1、U2、U3、U4代表的第一张、第二张…

Nacos AP架构集群搭建(Windows)

手写SpringCloud项目地址&#xff0c;求个star github:https://github.com/huangjianguo2000/spring-cloud-lightweight gitee:https://gitee.com/huangjianguo2000/spring-cloud-lightweigh 目录&#xff1a; 一&#xff1a;初始化MySQL 二&#xff1a;复制粘贴三份Nacos文…

分类预测 | MATLAB实现GAPSO-BP遗传算法组合粒子群算法优化BP神经网络多输入分类预测

分类预测 | MATLAB实现GAPSO-BP遗传算法组合粒子群算法优化BP神经网络多输入分类预测 目录 分类预测 | MATLAB实现GAPSO-BP遗传算法组合粒子群算法优化BP神经网络多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.分类预测 | MATLAB实现GAPSO-BP遗…

LabVIEW使用图像处理进行交通控制性能分析

LabVIEW使用图像处理进行交通控制性能分析 采用普雷维特、拉普拉斯、索贝尔和任意的空间域方法对存储的图像进行边缘检测&#xff0c;并获取实时图像。然而&#xff0c;对四种不同空间域边缘检测方法的核的性能分析。 以前&#xff0c;空路图像存储在数据库中&#xff0c;道路…

【JAVA】变量的作用域与生存周期

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 文章目录 前言变量的作用域变量的生命周期局部变量全局变量 前言 变量&#xff0c;我们学习过程中逃不掉的知识&#xff0c;无论在哪种语言中我们都需要学会去合理的运用它&#xff0c;今…

excel 下载方法封装

1.首先需要拿到后端返回的URL下载地址 2.写个下载方法 // url 接口返回的下载地址。例如&#xff1a;https://cancer-research.oss-cn-beijing.aliyuncs.com/yuance-platform-permission/校内共享数据导入模板.xlsx // name 文件名称 例如&#xff1a; 校内共享数据导入模板 /…

(一)Unity开发Vision Pro介绍

1.介绍 1.1 介绍 VisionOS 可实现与现实世界无缝集成并与其他虚拟内容共存的 3D 多任务体验。这为个人生产力、生活方式和娱乐应用打开了一个充满新可能性的世界&#xff0c;并为开发人员打开了一个全新的市场。然而&#xff0c;它也带来了围绕多任务处理和与身体互动的新挑战…

Aspera替代方案:探索这些安全且可靠的文件传输工具

科技的发展日新月异&#xff0c;文件的传输方式也在不断地更新换代。传统的邮件附件、FTP等方式已经难以满足人们对于传输速度和安全性的需求了。近年来&#xff0c;一些新兴的文件传输工具受到了人们的关注&#xff0c;其中除了知名的Aspera之外&#xff0c;还有许多可靠安全的…

FPGA_学习_15_IP核_VIO

前一篇博客我们提到在线调试的时候&#xff0c; 可执行文件只要烧进板子&#xff0c;程序它就会自己跑起来&#xff0c;不会等你点 这个按钮&#xff0c;它才开始跑。我们测试的模块中&#xff0c;里面可能有几个我们关心的信号&#xff0c;它会在程序刚运行很短的时间内发生状…