Python案例|Pandas正则表达式

news2024/11/21 2:30:31

图片

字符串的处理在数据清洗中占比很大。也就是说,很多不规则的数据处理都是在对字符串进行处理。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.coloradmin.cn/o/885585.html

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

相关文章

爆肝整理,pytest自动化测试框架-常用插件整理(必知必会)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Pytest拥有丰富的…

VS2019 + Qt : setToolTip的提示内容出现乱码

VS2019 Qt : setToolTip的提示内容出现乱码 在使用setToolTip()时, setToolTip(QString("asd你好!");标签提示只有英文是对的,中文是乱码! 应该是编码出了问题。默认情况下,Qt使用的是UTF-8编码&#xf…

【Apollo】推动创新:探索阿波罗自动驾驶的进步(含安装 Apollo的详细教程)

前言 Apollo (阿波罗)是一个开放的、完整的、安全的平台,将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统。 开放能力、共享资源、加速创新、持续共赢是 Apollo 开放平台的口号。百度把自己所拥有的强大、…

k8s问题汇总

作者前言 本文章为记录使用k8s遇到的问题和解决方法,文章持续更新中… 目录 作者前言正常配置ingress,但是访问错误添加工作节点报错安装k8s报错使用kubectl命令报错container没有运行安装会出现kubelet异常,无法识别删除k8s集群访问dashboa…

Ruby软件外包开发语言特点

Ruby 是一种动态、开放源代码的编程语言,它注重简洁性和开发人员的幸福感。在许多方面都具有优点,但由于其动态类型和解释执行的特性,它可能不适合某些对性能和类型安全性要求较高的场景。下面和大家分享 Ruby 语言的一些主要特点以及适用的场…

小红书种草营销深度解析:如何打造爆款产品

小红书作为一款深受年轻人喜爱的社交电商平台,已然成为众多品牌竞相争夺的营销阵地。小红书种草营销作为一种新兴的营销方式,其强大的传播效果和转化率备受品牌商家青睐。本文伯乐网络传媒将深入探讨小红书种草营销如何做,为品牌商家提供一份…

如何配置Apple推送证书 push证书

如何配置Apple推送证书 push证书 转载:如何配置Apple推送证书 push证书 想要制作push证书,就需要使用快捷工具appuploader工具制 作证书,然后使用Apple的推送功能配置push证书,就可以得到了。PS:push没有描述文件&a…

Python爬虫——scrapy_当当网图书管道封装

创建爬虫项目 srcapy startproject scrapy_dangdang进入到spider文件里创建爬虫文件(这里爬取的是青春文学,仙侠玄幻分类) srcapy genspider dang http://category.dangdang.com/cp01.01.07.00.00.00.html获取图片、名字和价格 # 所有的se…

Android-网络访问技术Retrofit浅析

Retrofit是一种基于注解的网络请求库,专门用于在Android应用中进行网络访问。它使用简洁的方式定义了网络请求的接口,并自动将请求结果解析为Java对象。Retrofit的核心原理是利用了Java的动态代理技术,将网络请求接口的注解信息转化为具体的网…

使用冒泡排序模拟qsort

目录 冒泡排序🐒: 冒泡排序特点👀: 模拟&改造🔧: 1、让冒泡排序能够接受其他的数据类型,使用参数的改造。🚗 2、比较的方式进行改造❤ 思路分析🧠:…

unity中导入自定义模型

unity中导入自定义模型 准备软件步骤1从SoildWorks中导出模型为STEP格式2将STEP格式文件导入到3DS Max中,再导出为FBX格式3将FBX格式导入至unity中 准备软件 需要SoildWorks、3DS Max和Unity 3D软件步骤 1从SoildWorks中导出模型为STEP格式 2将STEP格式文件导入到…

[PyTorch][chapter 52][迁移学习]

前言: 迁移学习(Transfer Learning)是一种机器学习方法,它通过将一个领域中的知识和经验迁移到另一个相关领域中,来加速和改进新领域的学习和解决问题的能力。 这里面主要结合前面ResNet18 例子,详细讲解一…

如何用chatGPT回答女朋友的死亡问题

引言 在爱情的迷雾中,女友的死结问题常常令人犯难。然而,借助ChatGPT的智慧,或许能够开辟一片全新的天地。其独到的见解和无限的可能性,或将为我们的情感困惑带来意想不到的解答。正如科技在塑造我们的生活,也或许能为…

家居行业,瞄准软文营销

对于很多家居品牌来说,传统营销形式越来越无法打动他们,在以渠道为王的环境下,家居品牌更需要思考地是:要带给消费者新的价值和体验究竟是什么? 因为在目前的大环境下,在内容信息上展现的生动性、直接性上、…

Spark SQL优化:NOT IN子查询优化解决

背景 有如下的数据查询场景。 SELECT a,b,c,d,e,f FROM xxx.BBBB WHERE dt ${zdt.addDay(0).format(yyyy-MM-dd)} AND predict_type not IN ( SELECT distinct a FROM xxx.AAAAAWHERE dt ${zdt.addDay(0).format(yyyy-MM-dd)} ) 分析 通过查看SQL语句的执行计划基本…

全面管控企业资产,这个小妙招做到了!

随着全球金融市场的复杂性增加以及资产多样化的趋势,确保资产的最大价值和最小风险已经成为一个迫切的需求。资产管理系统能够更好地掌握自己的财务状况,做出明智的决策。 从个人投资者到大型企业,都可以从中受益,无论是实时监控投…

腾讯云GPU服务器GN7实例NVIDIA T4 GPU卡

腾讯云GPU服务器GN7实例搭载1颗 NVIDIA T4 GPU,8核32G配置,系统盘为100G 高性能云硬盘,自带5M公网带宽,系统镜像可选Linux和Windows,地域可选广州/上海/北京/新加坡/南京/重庆/成都/首尔/中国香港/德国/东京/曼谷/硅谷…

C#如何打包EXE程序生成setup安装文件

项目结束之后,有需要将winForm程序打包成.exe文件提供给用户。 这里记录一下打包过程。 1:首先获取打包插件,如果你的VS已经安装,忽略此步骤。 点击 工具->扩展和更新,选择联机,搜索installer&#x…

AntPro 模版代码

1 ProTable 实现选择和反显 页面1 页面2 选择页面2选择之后反显到页面1 &#xff0c;且支持跨页选择。同时下次进来页面1展示的数据要反显到页面2被选中。 页面2代码 <ProTablerowKey"id"columns{columns}request{(params: any) > {const newParams {pageI…

androidstudio引入jar包

如图&#xff0c;选择project 然后在src下创建一个lib文件夹&#xff0c;将要添加到项目中的jar包粘贴lib里面&#xff0c;如图 接着选中jar包&#xff0c;右击&#xff0c;会出一个弹窗&#xff0c;选择Add As Library…&#xff0c;如图 会出现一个弹窗&#xff0c;点击OK…