- 博客主页:长风清留扬-优快云博客
- 系列专栏:Python基础专栏
- 每天更新大数据相关方面的技术,分享自己的实战工作经验和学习总结,尽量帮助大家解决更多问题和学习更多新知识,欢迎评论区分享自己的看法
- 感谢大家点赞👍收藏⭐评论
从字符串中提取数字
嘿,朋友们!你有没有遇到过这样的情况:手里拿着一堆文本数据,却苦于找不到其中的数字信息?别担心,今天咱们就来聊聊如何在Python中轻松提取字符串里的数字。无论是处理日志文件、分析用户评论,还是抓取网页数据,掌握这个小技巧都能让你的工作变得事半功倍。别再让繁琐的数据处理任务绊住你的脚步,跟着我一起来学习这个简单又实用的Python技能吧!
方法一:使用正则表达式(Regular Expressions)
正则表达式提取字符串中的整数
正则表达式是处理字符串的强大工具,能够匹配特定的模式。在Python中,re模块提供了正则表达式的支持。
import re # 导入Python的正则表达式模块
text = "abc123def456ghi789" # 定义一个包含字母和数字的字符串
# 使用re.findall()方法查找字符串中所有与正则表达式r'\d+'匹配的数字序列
# r'\d+'是一个正则表达式,其中\d代表数字字符,+代表前面的字符(这里是数字)可以出现一次或多次
# 因此,r'\d+'可以匹配一个或多个连续的数字字符
numbers = re.findall(r'\d+', text) # 返回一个包含所有匹配数字序列(作为字符串)的列表
# 使用列表解析将字符串列表numbers中的每个元素转换为整数
# 对于numbers列表中的每个元素num,int(num)将其从字符串类型转换为整数类型
# 结果是一个新的列表numbers_int,它包含与numbers相同的数字,但现在是整数类型
numbers_int = [int(num) for num in numbers]
# 打印出包含数字字符串的列表和包含整数的列表
print(numbers) # 输出: ['123', '456', '789'],这是数字序列作为字符串的列表
print(numbers_int) # 输出: [123, 456, 789],这是数字序列作为整数的列表
- 导入模块:
首先,代码通过import re语句导入了Python的正则表达式模块re,以便后续可以使用该模块提供的函数和正则表达式功能。
定义字符串:接着,代码定义了一个名为text的字符串变量,该字符串包含一些字母和数字字符。我们的目标是提取出这些数字字符组成的序列。 - 查找数字序列:
然后,代码使用re.findall()函数和正则表达式r’\d+'来查找字符串text中所有与正则表达式匹配的数字序列。re.findall()函数返回一个列表,其中包含所有找到的匹配项。在这个例子中,找到的匹配项是字符串text中所有连续的数字字符序列。 - 转换数字类型:
接下来,代码使用列表解析来遍历numbers列表(包含数字字符串的列表),并将每个元素(数字字符串)转换为整数类型。转换后的整数被收集到一个新的列表numbers_int中。 - 打印结果:
最后,代码使用print()函数打印出两个列表:numbers(包含数字字符串的列表)和numbers_int(包含整数的列表)。这允许我们查看提取和转换的结果。
正则表达式提取字符串中的整数和小数
import re
text = "abc123.456def-789ghi0.987jkl4567mno123.00"
# 定义正则表达式模式,匹配整数和小数
# \d+ 匹配一个或多个数字(整数部分)
# (\.\d+)? 匹配可选的小数部分(小数点后跟一个或多个数字)
pattern = r'-?\d+(\.\d+)?'
# 使用findall方法找到所有匹配的数字
numbers = re.findall(pattern, text)
# 将找到的数字字符串列表(可能是负数)转换为浮点数列表(如果需要)
numbers_float = [float(num) for num in numbers]
print(numbers) # 输出: ['123.456', '-789', '0.987', '4567', '123.00']
print(numbers_float) # 输出: [123.456, -789.0, 0.987, 4567.0, 123.0]
- -?:匹配可选的负号。
- \d+:匹配一个或多个数字(整数部分)。
- (.\d+)?:匹配可选的小数部分,其中 . 是小数点,\d+ 是一个或多个数字。整个小数部分被括在括号中,并标记为可选(?)。
注意,这个正则表达式还会匹配负数,因为我们在模式的开头添加了 -?。如果你不想匹配负数,可以移除这个部分。
方法二:使用列表解析和字符串方法
如果字符串的结构相对简单,可以使用列表解析和字符串的isdigit方法。
text = "abc123def456ghi789"
# 使用列表解析和字符串的join方法,然后分割字符串并过滤出数字部分
numbers = ''.join([char if char.isdigit() else ' ' for char in text]).split()
# 将找到的数字字符串列表转换为整数列表(如果需要)
numbers_int = [int(num) for num in numbers]
print(numbers) # 输出: ['123', '456', '789']
print(numbers_int) # 输出: [123, 456, 789]
方法三:使用生成器和迭代
使用生成器和迭代的方法,可以更灵活地处理字符串。
text = "abc123def456ghi789"
def extract_numbers(s):
number = []
for char in s:
if char.isdigit():
number.append(char)
else:
if number:
yield int(''.join(number))
number = []
if number:
yield int(''.join(number))
numbers_gen = extract_numbers(text)
numbers_int = list(numbers_gen)
print(numbers_int) # 输出: [123, 456, 789]
方法四:使用filter和str.isdigit(仅提取单个数字)
如果只需要提取单个数字字符,可以使用filter函数。
text = "abc123def456ghi789"
# 提取所有数字字符
digits = filter(str.isdigit, text)
# 将数字字符转换为列表(仍然是字符形式)
digits_list = list(digits)
# 如果需要整数列表,可以将字符转换为整数
numbers_int = [int(digit) for digit in digits_list]
print(digits_list) # 输出: ['1', '2', '3', '4', '5', '6', '7', '8', '9']
print(numbers_int) # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
注意,这种方法会将每个数字字符单独提取出来,而不是提取完整的数字序列。
方法五:isnumeric()函数提取数字
在Python中,isnumeric() 方法是字符串对象的一个方法,用于判断字符串中的所有字符是否都是数字字符,并且这些数字字符至少表示一个数字(例如,它不会为罗马数字或汉字数字返回 True)。
text = "abc123def456ghi789"
numbers = []
current_number = ""
for char in text:
if char.isnumeric():
current_number += char
else:
if current_number: # 如果current_number不为空,说明我们之前收集到了一串数字
numbers.append(int(current_number)) # 将收集到的数字转换为整数并添加到列表中
current_number = "" # 重置current_number以收集下一个数字
# 检查最后一个数字(如果字符串以数字结尾)
if current_number:
numbers.append(int(current_number))
print(numbers) # 输出: [123, 456, 789]
在这个例子中,我们遍历了字符串 text 中的每个字符,并使用 isnumeric() 方法来检查它是否是数字字符。如果是,我们就将它添加到 current_number 字符串中。当我们遇到一个非数字字符时,我们检查 current_number 是否为空(如果不为空,说明我们之前收集到了一串数字),将其转换为整数并添加到 numbers 列表中,然后重置 current_number。最后,我们还需要检查 current_number 是否在遍历结束后仍然包含数字(这发生在字符串以数字结尾时)。
从字符串中提取数字的应用场景
-
数据清洗与预处理
在数据分析和机器学习项目中,数据通常来源于各种文本格式,如日志文件、用户评论、社交媒体帖子等。在这些文本中,数字可能代表关键信息,如时间戳、评分、数量等。通过提取这些数字,可以进行更有效的数据清洗和预处理,为后续的分析和建模提供准确、结构化的数据。 -
日志分析
系统日志中经常包含大量的数字和文本信息,如错误代码、用户ID、响应时间等。通过提取这些数字,可以快速定位问题、分析系统性能,并生成有用的报告。例如,可以提取响应时间数字来评估系统的响应时间分布,或者提取错误代码来统计不同类型的错误频率。 -
文本解析与挖掘
在文本挖掘和自然语言处理(NLP)任务中,提取字符串中的数字可以帮助理解文本的语义内容。例如,在新闻文章中提取股票价格、经济数据或比赛结果,可以为读者提供有价值的信息摘要。此外,在社交媒体分析中,提取数字可以揭示用户的行为模式,如发布内容的频率、点赞数、评论数等。 -
金融数据处理
在金融领域,文本格式的金融数据(如财务报告、新闻稿、社交媒体评论等)中经常包含关键的财务信息,如股票价格、市盈率、收益预测等。通过提取这些数字,可以进行财务分析和预测,为投资者提供决策支持。 -
用户输入解析
在交互式应用程序中,用户输入可能包含数字和文本的组合。例如,用户可能输入“我想要预订一个价值150美元的房间,入住日期是2023年10月1日”。通过提取这些数字,应用程序可以解析用户意图,并相应地执行操作,如计算费用、检查可用性、生成预订确认等。 -
网络爬虫与数据抓取
在Web爬虫和数据抓取任务中,提取字符串中的数字可以帮助收集有用的信息。例如,从商品页面上提取价格、评分、库存量等数字信息,可以为购物比价网站、产品推荐系统等提供数据支持。
推荐阅读
Python基础
Python全网最全基础课程笔记(三)——所有运算符+运算符优先级
Python全网最全基础课程笔记(五)——选择结构+Python新特性Match
Python全网最全基础课程笔记(七)——列表,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!
Python全网最全基础课程笔记(八)——字典,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!
Python全网最全基础课程笔记(九)——集合,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!
Python全网最全基础课程笔记(十)——元组,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!
Python全网最全基础课程笔记(十一)——字符串所有操作,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!
Python全网最全基础课程笔记(十二)——函数,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!
Python全网最全基础课程笔记(十三)——作用域,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!
Python全网最全基础课程笔记(十四)——异常处理机制,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!
有史以来最全的异常类讲解没有之一!爆肝3万字,终于把Python的异常类写完了!最全Python异常类合集和案例演示,第一部分
有史以来最全的异常类讲解没有之一!第二部分爆肝2万字,终于把Python的异常类写完了!最全Python异常类合集和案例演示,第二部分
有史以来最全的异常类讲解没有之一!第三部分爆肝4万字,终于把Python的异常类写完了!最全Python异常类合集和案例演示,第三部分
Python疑难杂症百科-BUG编年史
浮点数精度不再是困扰:Python高手的精准编程秘籍!解决Python浮点数精度问题!
还在为Python变量中遇到的BUG而发愁吗?,变量相关的问题和解决办法看这篇文章就够了!
还在为Python“运算符”中遇到的BUG而发愁吗?,变量相关的问题和解决办法看这篇文章就够了!
Python刷题面试宝典
Python “元组” ——Python面试100道实战题目练习,巩固知识、检查技术、成功就业
Python “字符串操作” ——Python面试100道实战题目练习,巩固知识、检查技术、成功就业
Python “集合” 100道实战题目练习,巩固知识、检查技术
Python “函数” ——Python面试100道实战题目练习,巩固知识、检查技术、成功就业
Python “异常处理机制” ——Python面试100道实战题目练习,巩固知识、检查技术、成功就业
Flink入门到就业
2024年最新Flink教程,从基础到就业,大家一起学习–基础篇
2024年最新Flink教程,从基础到就业,大家一起学习–入门篇
2024年最新Flink教程,从基础到就业,大家一起学习–Flink集群部署
2024年最新Flink教程,从基础到就业,大家一起学习–flink部署和集群部署(从本地测试到公司生产环境如何部署项目源码)
2024年最新Flink教程,从基础到就业,大家一起学习–Flink运行架构底层源码详解+实战
2024年最新Flink教程,从基础到就业,大家一起学习–Flink DataStream API-第一篇+源码讲解