上期,我们介绍了Python中re的用法,本期,我们通过解决一个实例来再深入学习一下re的用法,方便后期进行数据筛选、数据清洗等等操作。
一、全面筛选
例:请把下面一段文字中所有的数字提取出来:#昨日客流# 南京地铁3月27日客运量291.9,其中1号线80.1,2号线67.6,3号线62.7,4号线16.7,7号线11.8,10号线17.4,S1号线9,S3号线8.5,S6号线4.8,S7号线1.2,S8号线10.2,S9号线1.9(以上单位:万)
用python中的正则表达式实现一下:
import re text = "#昨日客流# 南京地铁3月27日客运量291.9,其中1号线80.1,2号线67.6,3号线62.7,4号线16.7,7号线11.8,10号线17.4,S1号线9,S3号线8.5,S6号线4.8,S7号线1.2,S8号线10.2,S9号线1.9(以上单位:万)" # 使用正则表达式匹配所有数字(包括小数)numbers = re.findall(r'\d+\.?\d*', text) # 将提取的数字转换为浮点数numbers = [float(num) for num in numbers] print(numbers)
运行结果为:
正则表达式\d+\.?\d*用于匹配整数和小数,其中\d+匹配一个或多个数字,\.?匹配0个或1个小数点,\d*匹配0个或多个数字。二、部分筛选的实现
如果我们只想筛选后面每条线路的数字,如何操作?
import retext = "#昨日客流# 南京地铁3月27日客运量291.9,其中1号线80.1,2号线67.6,3号线62.7,4号线16.7,7号线11.8,10号线17.4,S1号线9,S3号线8.5,S6号线4.8,S7号线1.2,S8号线10.2,S9号线1.9(以上单位:万)"# 使用正则表达式匹配所有数字(包括小数)numbers = re.findall(r'号线(\d+\.?\d*)', text)# 将提取的数字转换为浮点数numbers = [float(num) for num in numbers]print(numbers)
三、多匹配模糊筛选如果上面的部分文字缺失,比如:1号线80.1变为1号80.1,后面的文字不变,该怎么处理?
#昨日客流# 南京地铁3月27日客运量291.9,其中1号80.1,2号线67.6,3号线62.7,4号线16.7,7号线11.8,10号线17.4,S1号线9,S3号线8.5,S6号线4.8,S7号线1.2,S8号线10.2,S9号线1.9(以上单位:万)python的处理如下:
import retext = "#昨日客流# 南京地铁3月27日客运量291.9,其中1号80.1,2号线67.6,3号线62.7,4号线16.7,7号线11.8,10号线17.4,S1号线9,S3号线8.5,S6号线4.8,S7号线1.2,S8号线10.2,S9号线1.9(以上单位:万)"# 使用正则表达式匹配所有数字(包括小数)numbers = re.findall(r'(号线|号)(\d+\.?\d*)',text)print(numbers)# 将提取的数字转换为浮点数number= [num[1] for num in numbers]print(number)
运行结果为:
四、结语
Python中re是一个非常好的筛选工具,用好re可以很方便地实现数据筛选、清洗等,多学多练,不断学习新知识和技能,实践提升自己