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

news2025/2/26 18:03:22

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

以下是一些示例代码:

1. 从文本中提取数字

1.1. 使用re.findall提取数字

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

import re

text = "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 parser

text = "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.coloradmin.cn/o/1889216.html

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

相关文章

测试Andrew NG的语言翻译Agent

我正在测试 Andrew Ng 的语言翻译 A​​I 代理系统及其在逆变换下的稳定性。 给定源语言的文本&#xff0c;我们应用翻译函数 f&#xff0c;然后应用 f 的逆。它应该是不变的&#xff1a; 但是&#xff0c;数学与语言翻译有什么关系&#xff1f; 在完美的系统中&#xff0c;从…

德翔海运核心盈利指标大幅下滑,大额分红56亿不缺钱仍募资补流

《港湾商业观察》黄懿 5月30日&#xff0c;航运公司德翔海运&#xff08;TS Lines&#xff0c;下称“德翔海运”&#xff09;再一次向港交所递交招股书&#xff0c;计划在主板挂牌上市&#xff0c;由摩根大通和招商证券国际担任联席保荐人。 据悉&#xff0c;2022年至2023年&…

【js】数组元素拼接、数组元素类型转换

一、数组元素拼接 二、数组元素类型转换 1、字符串数组 转换成 数字型数组 [1, 2, 3].map(Number) // [1,2,3] 2、数字型数组 转换成 字符串数组 [1, 2, 3].map(String) // [1, 2, 3]

Java语法 小白入门参考资料 数组

数组的基本概念 数组&#xff1a;可以看成是相同类型元素的一个集合。在内存中是一段连续的空间。 比如现实中的车库&#xff1a; 在java中&#xff0c;包含6个整形类型元素的数组&#xff0c;就相当于上图中连在一起的6个车位&#xff0c;从上图中可以看到&#xff1a; 数组…

【C++】开源:量化金融计算库QuantLib配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍量化交易库QuantLib配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#…

【linux】网络基础(3)——tcp协议

文章目录 TCP协议概括TCP头部格式TCP连接管理建立连接&#xff08;三次握手&#xff09;数据传输确认应答机制捎带应答 滑动窗口丢包问题 拥塞控制延时应达 终止连接&#xff08;四次挥手&#xff09; TCP协议概括 TCP是一个面向连接的协议&#xff0c;在传输数据之前需要建立连…

Zabbix 配置进程监控

Zabbix 进程监控介绍 Zabbix可以很方便地监控服务器上的各种进程。在使用Zabbix进行进程监控时&#xff0c;被监控的节点通常需要安装Zabbix Agent。Zabbix Agent 是一个轻量级的代理程序&#xff0c;安装在被监控的主机上&#xff0c;用于收集系统的各种性能数据和指标&#…

OpenBMB × Hugging Face × THUNLP,大模型课开班丨伙伴活动推荐

2022 年&#xff0c;OpenBMB 开源社区联合 THUNLP 开国内大模型公开课先河&#xff0c;全网百万级播放量&#xff0c;已帮助无数大模型爱好者从入门到精通。 这个夏天&#xff0c;OpenBMB 携手 HuggingFace、THUNLP 和面壁智能&#xff0c;推出大模型公开课第二季。全球知名开…

vue实现一个简单的审批绘制功能

1、vue代码 <div class"approval"><div class"approval_ul" v-for"(item,key) in approvalList" :key"key"><div><el-radio-group v-model"item.jointlySign"><el-radio label"1">…

人大出品!最适合大模型初学者人手的LLM大语言模型综述,爆火全网

今天给大家推荐一本大模型&#xff08;LLM&#xff09;这块的一本外文书&#xff0c;经过整理已经出中文版了&#xff0c;就是这本《大型语言模型综述》&#xff01;本书在git上有9.2k star&#xff0c;还是很不错的一本大模型方面的书。 本教程内容主要内容&#xff1a;中文版…

外挂级OCR神器:免费文档解析、表格识别、手写识别、古籍识别、PDF转Word

智能文档解析&#xff1a;大模型友好的文档解析工具 PDF转Markdown 支持将任意格式的文件&#xff08;图片、PDF、Doc&#xff0f;Docx、网页等&#xff09;解析为Markdown或Json格式&#xff0c;以对LLM友好的方式呈现。 更高速度&#xff1a;100页PDF最快1.5s完成解析 更大…

Qt/C++编写地图应用/离线地图下载/路径规划/轨迹回放/海量点/坐标转换

一、前言说明 这个地图组件写了很多年了&#xff0c;最初设计的比较粗糙&#xff0c;最开始只是为了满足项目需要&#xff0c;并没有考虑太多拓展性&#xff0c;比如最初都是按照百度地图写死在代码中&#xff0c;经过这几年大量的现场实际应用&#xff0c;以及大量的用户提出…

1.7-自然语言的分布式表示-skip-gram模型代码实现

文章目录 1 skip-gram模型的实现1.1模型结构的实现1.2前向传播的实现1.3反向传播的实现 2 skip-gram模型的计算与学习3总结 书上提供了skip-gram模型的代码实现&#xff0c;但是没有去讲解&#xff1b;这里我们自己来看看他提供的代码&#xff1b;看代码的时候&#xff0c;尤其…

yarn不同操作系统的安装与配置

Yarn 是一个快速、可靠且安全的依赖包管理工具&#xff0c;用于替代 npm。以下是在不同操作系统上安装和配置 Yarn 的步骤。 1. 安装 Node.js 在安装 Yarn 之前&#xff0c;请确保已经安装了 Node.js&#xff0c;因为 Yarn 需要 Node.js 环境。你可以在 Node.js — Run JavaSc…

极简通俗VAE

一、VAE 背景&#xff1a;VAE什么变分自编码器&#xff0c;听起来起名都头大&#xff0c;用大白话告诉你。 把一个复杂图片压缩成两个参数&#xff0c;用这个参数采样再复原。 这个简单的东西是两个参数&#xff0c;均值和方差&#xff0c;用&#xff08;0&#xff0c;1&…

15kg级弹簧刀高速巡飞无人机技术详解

弹簧刀高速巡飞无人机&#xff0c;作为一种先进的战术导弹系统&#xff0c;融合了无人机与导弹的双重特性&#xff0c;成为了现代战争中不可或缺的侦察与打击利器。该无人机以其小巧的外形设计、优异的性能表现和广泛的适用领域&#xff0c;受到了全球军事领域的广泛关注。弹簧…

ChatGPT如何应用在谷歌seo?

ChatGPT在提升博客和创作效率方面非常有用。它可以帮助你快速生成吸引人的标题&#xff0c;确保内容第一眼就能抓住读者的注意力。不仅如此&#xff0c;ChatGPT还能根据你的主题生成详细的文章提纲&#xff0c;让你在写作时思路更加清晰。关键词优化也是它的强项&#xff0c;可…

当《开心消消乐》遇上 AI 推理,我们找到了高质量关卡背后的原因!

随着 AI 热潮席卷各行各业&#xff0c;其落地应用已经成为企业技术研发升级的工作重心。人工智能应用的升级不仅需要软件层面的升级迭代&#xff0c;还需要大规模基础设施的支撑。然而&#xff0c;自行搭建大规模算力、存储基础设施对于大多数企业而言都存在技术难度、人力资源…

OpenSSL的一些使用案例

目录 一、介绍 二、基本使用 1、Shell &#xff08;1&#xff09;文件加解密 &#xff08;2&#xff09;生成密钥文件 2、API &#xff08;1&#xff09;md5sum &#xff08;2&#xff09;AES256加解密 一、介绍 本篇博客重点不是详细描述 OpenSSL 的用法&#xff0c;只…

【IA修补一切】Inpaint Anything: Segment Anything Meets Image Inpainting论文解读

作者来自中国科学技术大学和东部高级研究院。文章提出了一个新的图像修复工具“Inpaint Anything (IA)”&#xff0c;它结合了不同的视觉模型&#xff0c;如Segment Anything Model (SAM)、LaMa、Stable Diffusion (SD)等&#xff0c;以实现更高级的图像编辑功能。 论文&#x…