【Python】从文本字符串中提取数字、电话号码、日期、网址的方法汇总(全!)

我们在做数据清洗的时候,有时候会遇到将一堆文本中提取我们需要的内容,最常见的是,从一大段文本中提取出数字、电话号码、日期、网址等。而在Python中,正则表达式re,则可以满足我们从文本中提取数字、电话号码和日期等需要。

以下是一些示例代码:

1. 从文本中提取数字

1.1. 使用re.findall提取数字

从文本中提取数字,可以用findall来查找:

import retext = "The price is 99.99 and the quantity is 100."
numbers = re.findall(r'\d+', text)  # 提取所有数字
float_numbers = re.findall(r'\d+\.\d+', text)  # 提取所有浮点数
print('只提取所有整数的方法是:',numbers)  
# 输出:只提取整数的方法是: ['99', '99', '100']print('只提取所有浮点数的方法是:',float_numbers) # 输出: 只提取浮点数的方法是: ['99.99']

1.2. 使用re.compile提取数字

如果我们只是单纯使用re.findall 来提取数字,整数和浮点数会分开来提取,在处理数字的时候就会很不方便。

因此,我们在上面的基础上,结合正则表达式分组re.compile()来查找, 编译后的正则表达式对象可以使用groupindex属性来访问分组的名称和索引。可以提高正则表达式的匹配效率。

import re
text = "The price is 99.99 and the quantity is 100"
pattern = re.compile(r'(?<=)\d+\.?\d*')
pattern.findall(text)
#['99.99', '100']

groupindex属性:在Python中,正则表达式的groupindex属性是一个字典,它存储了正则表达式中所有命名捕获组(Named Capturing Groups)的名称和它们对应的索引。每个命名捕获组都有一个唯一的名称,groupindex属性将这些名称映射到它们在正则表达式中的索引。
也可以创建一个命名来捕获组,详情可以看下文的从文本中提取日期的例子。

2. 从文本中提取手机号

我们国家手机号码的格式, 通常是以1开头,第二位是3、4、5、6、7、8或9,后面跟着9位数字。一个常见的正则表达式模式匹配中国大陆的手机号码如下:

1[3-9]\d{9}

解释一下这个正则表达式:

1:手机号码以数字1开头。
[3-9]:第二位数字是3到9之间的任意一个数字。
\d{9}:随后是9个数字,\d是数字的简写,{9}表示重复9次。

以下是使用Python re 模块提取手机号码的示例代码:

import re# 示例文本
text = "我的手机号码是13812345678,不是12345678901。"# 正则表达式模式匹配中国大陆的手机号码
pattern = r'1[3-9]\d{9}'# 查找所有匹配的手机号码
mobile_numbers = re.findall(pattern, text)print("找到的手机号码:", mobile_numbers)

这段代码会输出文本中所有的手机号码。re.findall 函数返回一个列表,包含所有匹配的手机号码字符串。

如果要匹配更复杂的手机号码,例如支持其他国家的手机号码或者更复杂的格式,你可能需要调整正则表达式以适应不同的规则。

注意:由于手机号码的格式可能因国家和地区而异,如果我们处理国际手机号码,可能需要使用更通用的正则表达式,例如:

+?\d{1,3}?[-.\s]?(?\d{1,4}?)?[-.\s]?\d{1,4}[-.\s]?\d{1,4}[-.\s]?\d{1,9}

这个表达式尝试匹配包括国家代码,和各种分隔符的国际手机号码,但可能不会覆盖所有情况,并且可能需要根据具体需求进行调整。

3. 从文本中提取日期

日期的格式也非常多样,这里以一种常见的格式为例:

3.1. 使用re.findall提取日期:

如果遇到的文本中的日期是倒叙,可以使用re.findall的方法

text = "The event will be on 12/31/2024 or 01-02-2025."
dates = re.findall(r'\d{1,2}/\d{1,2}/\d{4}', text)  # 提取月/日/年格式的日期
print(dates)  
# 输出: ['12/31/2024']

3.2. 使用re.search筛选日期

re.search可以自定义数字的长度来匹配固定的日期格式,比较清晰明了

import re
text='2023-03-05的时间已经过了几年了'
#注:text='2012年3月3日' 这种类型不可以,要用replace_fromtext,然后再用这个
import datetime
def Not_none(n):if n != None:return n        
match = re.search(r'\d{4}-\d{2}-\d{2}', text)
match1 = re.search(r'\d{4}-\d{2}-\d{1}', text)
match2 = re.search(r'\d{4}-\d{1}-\d{2}', text)
match3 = re.search(r'\d{4}-\d{1}-\d{1}', text)        
time_=list(filter(Not_none, [match, match1, match2, match3]))[0]
date_ = datetime.datetime.strptime(time_.group(),'%Y-%m-%d').date()
print( date_ )
#2023-03-05

不过,正则表达式需要根据实际的文本格式进行调整。如果我们需要匹配更复杂的日期格式,可能需要编写更复杂的正则表达式,或者使用日期解析库如 dateutil。

3.3. 结合 dateutil 解析日期

如果你想要更智能地解析日期,可以使用 dateutil 库,它能够识别多种日期格式:

import re
from dateutil import parsertext = "The event will be on 12/31/2024 or 01-02-2025."
dates = re.findall(r'\d{1,2}[/-]\d{1,2}[/-]\d{2,4}|\b\d{1,2} \w+ \d{4}', text)
parsed_dates = [parser.parse(date) for date in dates]
print(parsed_dates)  # 输出日期对象列表
#[datetime.datetime(2024, 12, 31, 0, 0), datetime.datetime(2025, 1, 2, 0, 0)]
#需要按需要转换时间格式

3.4.使用 re.compile 获取日期

使用自定义的 带有命名捕获组的正则表达式,以年、月、日来命名这个组,最后的形式以列表中的元组来展示:

text='2023-03-05的时间已经过了几年了'
pattern = re.compile(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})')
pattern.findall(text)
#[('2023', '03', '05')]

4. 从文本中提取网址

我们有时候需要整理网址的时候,会遇到一些不完整的网址,需要做拼接,或者再处理;
如这个例子:

打算把【…/Company_View/Default/f/f99fa474-d1f1-484e-8953-006bf6dfaec0.shtml 】
整理成【https://Company_View/Default/f/f99fa474-d1f1-484e-8953-006bf6dfaec0.com】

经过观察,我们需要把前面的多余的符号和后缀去掉,然后拼接需要的https、com 就好,一下是处理的过程:

import re
str1='../Company_View/Default/4.shtml'new_net='https://'+str1[str1.find('/')+1:str1.rindex(".")]+'.com'
print(new_net)
#'https://Company_View/Default/4.com'

这里使用了,字符串的的findrindex的方法。我们先索引第一个“/”的位置,从这个位置到最后一个“.”的位置,用rindex是从右边开始数起来。

总结:正则表达式很强大,但也需要仔细地编写以避免错误匹配哦!

在这里插入图片描述

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

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

相关文章

一篇文章入门主成分分析PCA

文章目录 基本概念事件随机变量独立同分布离散型随机变量伯努利分布&#xff08;两点分布&#xff09;二项分布几何分布泊松分布 连续型随机变量正态分布 期望方差标准化协方差相关系数线性组合特征值和特征向量特征值分解对称矩阵的特征值分解 齐次线性方程组单位向量基向量矩…

钉钉机器人接入Dify工作流

实现钉钉机器人接入dify工作流&#xff0c;完成ai 流式问答 代码地址 有用的话点个star github地址 效果 配置使用 修改.env_template文件 为.env 设置.env文件内的环境变量 API_KEY: dify的api_keyAPI_URL: dify 的api接口CLIENT_ID : 钉钉机器人应用的idCLIENT_SECRET:钉…

松下护眼大路灯值得买吗?实测对比书客、松下、雷士三款热门护眼灯

松下护眼大路灯值得买吗&#xff1f;面对长时间的频繁用眼&#xff0c;选择一款可以提供宽广接近自然光的护眼大路灯&#xff0c;用了才知道有多香&#xff0c;而大路灯的选购也有讲究&#xff0c;在面对市面上的琳琅满目的护眼大路灯&#xff0c;怎么选好一款灯也是个大学问&a…

layui-页面布局

1.布局容器 分为固定和完整宽度 class layui-container 是固定宽度 layui-fluid是完整宽度

【Python网络通信】基于Bypy调用百度网盘api实现自动上传和下载网盘文件

网盘对于大家的生活工作可以说是息息相关&#xff0c;但是如果每天都重复去上传下载文件就会很浪费时间&#xff0c;所以有没有什么办法可以解放双手&#xff1f;那就是网盘接口&#xff0c;本文通过Bypy库实现百度网盘的自动上传和下载文件。 原创作者&#xff1a;RS迷途小书童…

Ubuntu20.04配置TurtleBot3 Waffle Pi远程控制

这里写目录标题 0. 机器人配置1. Ubuntu20.04配置TurtleBot3 Waffle Pi远程控制1.1 TurtleBot3 Waffle Pi端配置1.2 PC端配置1.2.1 安装turtlebot3的环境配置1.2.2 创建项目并安装Turtlebot31.2.3 配置环境变量 1.3 PC端与TurtleBot3进行通信1.3.1 PC端与机器人端互PING和SSH连…

pgrouting使用

pgRouting是一个为PostgreSQL和PostGIS提供路由功能的开源库&#xff0c;它支持复杂的图论算法&#xff0c;用于在地理网络中进行最短路径搜索。以下是pgRouting的一些应用实例。 注意事项&#xff1a; 1、路网表中的id、source、target必须是int类型&#xff0c;否则创建拓扑…

【论文解读】Multiagent Multitraversal Multimodal Self-Driving: Open MARS Dataset

Open MARS Dataset 摘要引言Dataset CurationVehicle SetupData CollectionDataset Statistics Benchmark Task and ModelPlace RecognitionNeural Reconstruction Experimental ResultsVisual Place RecognitionNeural Reconstruction Opportunities and Challenges结论 摘要 …

vivado联合modelsim仿真

一. 编译Vivado仿真库 打开Vivado&#xff0c;Tools -> Compile Simulation Libraries 二. 设置仿真工具和库路径 因为新建工程的默认仿真工具是Vivado Simulator&#xff0c;所以要使用Modelsim仿真&#xff0c;每个新工程都要设置一次&#xff0c;方法如下&#xff1a; …

上海小程序开发需要进行定制开发吗?

随着互联网技术与移动设备的不断成熟&#xff0c;小程序也已普及到人们日常生活的方方面面。随着企业与互联网联结的愈发深入&#xff0c;小程序的开发可以为企业带来更高效的经营模式&#xff0c;降本增效。那么&#xff0c;上海小程序作为无需安装且开发门槛较低的应用&#…

【Python】Python中的常量与变量

常量与变量 导读一、新建项目二、常量2.1 字面常量2.2 特殊常量 三、变量3.1 变量的定义3.2 变量的命名3.2.1 关键字 结语 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 在上一篇内容中我们详细介绍了Python环境的搭建过程&#xff0c;…

【等保2.0是什么意思?等保2.0的基本要求有哪些? 】

一、等保2.0是什么意思&#xff1f; 等保2.0又称“网络安全等级保护2.0”体系&#xff0c;它是国家的一项基本国策和基本制度。在1.0版本的基础上&#xff0c;等级保护标准以主动防御为重点&#xff0c;由被动防守转向安全可信&#xff0c;动态感知&#xff0c;以及事前、事中…

【Python基础篇】一篇文章入门Python,进入Python的世界

文章目录 0.前言1.打印&#xff08;Hello&#xff0c;World&#xff09;2.创建变量3.打印升级3.1 打印一句话中间加变量3.2 sep设置分隔符3.3 end和换行 4. 注释 0.前言 大家好&#xff0c;我是小辰&#xff0c;前几天做了个重大的决定&#xff0c;学习python。 首先&#xff0…

Docker部署ETCD 3.5.14(保姆级图文教程)

系列文章目录 Docker部署Nginx 1.21.5&#xff08;保姆级图文教程&#xff09; Docker部署MySQL 8.3.0&#xff08;保姆级图文教程&#xff09; Docker部署ETCD 3.5.14&#xff08;保姆级图文教程&#xff09; 文章目录 一、环境二、拉取镜像2.1 查找 Docker Hub 上的 ETCD 镜像…

人工智能在软件开发中的角色:助手还是替代者?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【FDTD Solutions(时域有限差分)仿真技术与应用】

FDTD Solutions&#xff08;时域有限差分&#xff09;是一种基于时域有限差分方法的电磁场仿真技术。它是一种数值计算方法&#xff0c;用于解决Maxwell方程组&#xff0c;能够模拟电磁波的传播和相互作用。 FDTD Solutions的原理是将空间分割成网格&#xff0c;并在每个网格点…

MySQL视图教程(04):显示视图

文章目录 MySQL显示视图语法使用场景示例 MySQL显示视图 MySQL 是一种流行的关系型数据库管理系统&#xff0c;可以用于创建和管理数据库中的表、视图等对象。视图是一种虚拟表&#xff0c;可以从一个或多个实际表中检索数据&#xff0c;并根据特定的需求进行过滤、排序和计算…

Shiro框架1

入门概述 1 权限的管理 1.1 什么是权限管理 基本上涉及到用户参与的系统都要进行权限管理&#xff0c;权限管理属于系统安全的范畴&#xff0c;权限管理实现对用户访问系统的控制&#xff0c;按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权(被赋予权限)的…

Python--线程基础

相关概念 线程是"轻量级进程",是计算机中CPU进行任务调度的最小单位。 线程属于进程的一部分,一个线程只能属于一个进程,而一个进程可以有多个线程,且至少有一个线程。 每个进程开始的创建的时候,都会随之创建一个主线程。 进程负责分配和隔离资源(CPU, 内存…

版本控制系统:Git 纯应用(持续更新)

基本操作 ctrl上行键&#xff1a;上次代码 本地仓库&#xff1a;Git init 新建文件&#xff1a;touch xxxx.xxx 查看状态&#xff1a;Git status 文件从工作区——暂存区&#xff1a;Git add ./文件名(.是通配符代表所有) 暂存区——仓库&#xff1a;Git commit -m &…