在Python中遇到字符串和数字要分开提取怎么办?这篇文章看完必会!

在这里插入图片描述

  • 博客主页:长风清留扬-优快云博客
  • 系列专栏: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 是否在遍历结束后仍然包含数字(这发生在字符串以数字结尾时)。

从字符串中提取数字的应用场景

  1. 数据清洗与预处理
    在数据分析和机器学习项目中,数据通常来源于各种文本格式,如日志文件、用户评论、社交媒体帖子等。在这些文本中,数字可能代表关键信息,如时间戳、评分、数量等。通过提取这些数字,可以进行更有效的数据清洗和预处理,为后续的分析和建模提供准确、结构化的数据。

  2. 日志分析
    系统日志中经常包含大量的数字和文本信息,如错误代码、用户ID、响应时间等。通过提取这些数字,可以快速定位问题、分析系统性能,并生成有用的报告。例如,可以提取响应时间数字来评估系统的响应时间分布,或者提取错误代码来统计不同类型的错误频率。

  3. 文本解析与挖掘
    在文本挖掘和自然语言处理(NLP)任务中,提取字符串中的数字可以帮助理解文本的语义内容。例如,在新闻文章中提取股票价格、经济数据或比赛结果,可以为读者提供有价值的信息摘要。此外,在社交媒体分析中,提取数字可以揭示用户的行为模式,如发布内容的频率、点赞数、评论数等。

  4. 金融数据处理
    在金融领域,文本格式的金融数据(如财务报告、新闻稿、社交媒体评论等)中经常包含关键的财务信息,如股票价格、市盈率、收益预测等。通过提取这些数字,可以进行财务分析和预测,为投资者提供决策支持。

  5. 用户输入解析
    在交互式应用程序中,用户输入可能包含数字和文本的组合。例如,用户可能输入“我想要预订一个价值150美元的房间,入住日期是2023年10月1日”。通过提取这些数字,应用程序可以解析用户意图,并相应地执行操作,如计算费用、检查可用性、生成预订确认等。

  6. 网络爬虫与数据抓取
    在Web爬虫和数据抓取任务中,提取字符串中的数字可以帮助收集有用的信息。例如,从商品页面上提取价格、评分、库存量等数字信息,可以为购物比价网站、产品推荐系统等提供数据支持。

推荐阅读

Python基础

Python全网最全基础课程笔记(一)——基础入门

Python全网最全基础课程笔记(二)——变量

Python全网最全基础课程笔记(三)——所有运算符+运算符优先级

Python全网最全基础课程笔记(四)——基本数据类型

Python全网最全基础课程笔记(五)——选择结构+Python新特性Match

Python全网最全基础课程笔记(六)——循环结构

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 “元组” ——Python面试100道实战题目练习,巩固知识、检查技术、成功就业

Python “字符串操作” ——Python面试100道实战题目练习,巩固知识、检查技术、成功就业

Python字典实战题目练习,巩固知识、检查技术

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-第一篇+源码讲解

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长风清留扬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值