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

我们在做数据清洗的时候,有时候会遇到将一堆文本中提取我们需要的内容,最常见的是,从一大段文本中提取出数字、电话号码、日期、网址等。而在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.mfbz.cn/a/767556.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

echarts实现3D柱状图(视觉层面)

一、第一种效果 效果图 使用步骤 完整实例&#xff0c;copy就可直接使用 <template><div :class"className" :style"{height:height,width:width}" /> </template><script>import echarts from echartsrequire(echarts/theme/…

《人人都是产品经理》:大产品

《人人都是产品经理》&#xff1a;大产品 产品之大时间之大空间之大&#xff1a;商业、产品、技术设计之大以写书为例 团队之大 回答一个问题 产品经理应该是管理者嘛&#xff1f;优点在于&#xff1a;缺点在于&#xff1a;总结&#xff1a; 如何让团队更加开心总结 产品之大 …

ChatGPT如何应用在谷歌seo?

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

hive内置函数

--查询hive的内置函数列表 show functions; --查询具体函数的使用描述 desc function extended 函数名 desc function extended current_database; 一.字符串函数 1.字符串的拆分 &#xff1a;split(); select split(hello,java;hi,bigdata,[,;]); [ ]内可以写多个分隔符 --…

【论文解读】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结论 摘要 …

7.2、指针变量的定义和使用

代码 #include <iostream> using namespace std; #include <string>int main() {//定义指针int a 10;//指针定义语法&#xff1a;数据类型 * 指针变量名int * p;//让指针记录变量a的地址p &a;cout << "a的地址为&#xff1a;" << &am…

恶意软件是什么意思?常见的恶意软件类型

您可能听说过很多有关恶意软件感染和运行服务器的危险的信息。但是&#xff0c;您可能还不清楚这在现实生活中意味着什么&#xff0c;或者该如何处理。让我们来了解一下&#xff1a;当人们谈论恶意软件时&#xff0c;他们真正指的是什么&#xff1f; 恶意软件是恶意软件的缩写&…

热网无线监测系统 SystemManager.asmx SQL注入漏洞复现

0x01 产品简介 热网无线监测系统是一种先进的热力管网监测解决方案,它通过无线通信技术实现对热力管网各项参数的实时监测和数据分析,以提高供热效率、降低能耗、保障管网安全。系统利用先进的传感器技术和无线通信技术,对热力管网中的温度、压力、流量等关键参数进行实时监…

【JAVA多线程】JDK中的各种锁,看这一篇就够了

目录 1.概论 1.1.实现锁的要素 1.2.阻塞队列 1.3.Lock接口和Sync类 2.各种锁 2.1.互斥锁 2.1.1.概论 2.1.2.源码 1.lock() 2.unlock() 2.2.读写锁 2.3.Condition 2.3.1.概论 2.3.2.底层实现 1.概论 1.1.实现锁的要素 JAVA中的锁都是可重入的锁&#xff0c;因为…

Google 发布了最新的开源大模型 Gemma 2,本地快速部署和体验

Gemma 2 是 Google 最新发布的开源大语言模型。它有两种规模&#xff1a;90 亿&#xff08;9B&#xff09;参数和 270 亿&#xff08;27B&#xff09;参数&#xff0c;分别具有基础&#xff08;预训练&#xff09;和指令调优版本&#xff0c;拥有 8K Tokens 的上下文长度&#…

Akamai+Noname强强联合 | API安全再加强

最近&#xff0c;Akamai正式完成了对Noname Security的收购。本文我们将向大家介绍&#xff0c;经过本次收购后&#xff0c;Akamai在保护API安全性方面的后续计划和未来愿景。 Noname Security是市场上领先的API安全供应商之一&#xff0c;此次收购将让Akamai能更好地满足日益增…

【C语言】extern 关键字

在C语言中&#xff0c;extern关键字用于声明一个变量或函数是定义在另一个文件中的。它使得在多个文件之间共享变量或函数成为可能。extern关键字常见于大型项目中&#xff0c;通常用于声明全局变量或函数&#xff0c;这些变量或函数的定义位于其他文件中。 基本用法 变量声明…

智能语音门锁:置入NV170D语音芯片ic 打造便捷生活新体验

一、智能门锁语音芯片开发背景 随着科技的飞速发展&#xff0c;传统门锁的局限性日益凸显&#xff0c;无法满足现代人对高效、安全生活的需求。在这样的时代背景下&#xff0c;智能门锁应运而生&#xff0c;它不仅继承了传统门锁的基本功能&#xff0c;更通过融入先进的科技元素…

YOLOv8改进 | 卷积模块 | SAConv可切换空洞卷积

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

市场规模5万亿,护理员缺口550万,商业护理企业如何解决服务供给难题?

干货抢先看 1. 据统计&#xff0c;我国失能、半失能老人数量约4400万&#xff0c;商业护理服务市场规模达5万亿。然而&#xff0c;当前养老护理员缺口巨大&#xff0c;人员的供需不匹配是很多养老服务企业需要克服的难题。 2. 当前居家护理服务的主要市场参与者分为两类&…

儿童无语言是否等同于自闭症?全面解析与认识自闭症

在探讨自闭症与儿童语言发展之间的关系时&#xff0c;我们首先需要明确的是&#xff0c;自闭症并非单一由语言缺失所定义&#xff0c;而是一个复杂的神经发育障碍&#xff0c;其核心特征包括社交互动和沟通能力的显著受损&#xff0c;以及重复、刻板的行为模式、兴趣或活动。 …

基于SpringBoot高校体育运动会管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

【HICE】基于httpd下的web服务器搭建

1.下载httpd&#xff1a; dnf install httpd -y 2.进入httpd中&#xff1a; cd /etc/httpd cd conf.d 3.编辑一个新的vhost.conf 4.重启httpd服务 systemctl restart httpd 5.关闭防火墙 systemctl stop firewalld setenforce 0 6.文本写入&#xff08;网页编辑&…

第6章:结构化开发方法

第6章&#xff1a;结构化开发方法 系统设计基本原理 1、抽象 抽象是一种设计技术&#xff0c;重点说明一个实体的本质方面&#xff0c;而忽略或者掩盖不是很重要或非本质的方面。 模块化 模块化是指将一个待开发的软件分解成若干个小的、简单的部分一模块&#xff0c;每个模…