Python 使用正则表达式从字符串中提取所有数字(建议收藏)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

引言:为什么需要从字符串中提取数字?

在编程和数据分析中,我们经常需要从文本中提取关键信息。例如,从日志文件中提取错误代码,从订单列表中提取价格,或者从网页中提取产品编号。Python 的正则表达式(Regular Expression,简称 regex)是完成这类任务的“瑞士军刀”,尤其在提取数字时,它能高效处理各种复杂场景。

本文将从零开始讲解如何使用 Python 的正则表达式从字符串中提取所有数字,适合编程初学者和中级开发者。通过循序渐进的案例和比喻,你将掌握这一实用技能,并了解其背后的逻辑。


正则表达式基础:理解“模式匹配”的核心

正则表达式是一种描述文本模式的工具,可以理解为“文字游戏规则”。它通过特定符号(元字符)定义搜索规则,例如:

  • \d:匹配任意单个数字(0-9)。
  • .:匹配除换行符外的任意字符。
  • +:匹配前面的字符一次或多次。

比喻:正则表达式就像“文字侦探”

想象你是一位侦探,需要从一段文字中找出所有数字。正则表达式就是你的“通缉令”:

  • \d 是通缉令中的“数字通缉令”;
  • \d+ 则是“连续数字的通缉令”,例如“123”或“4567”;
  • re.findall() 是你的“搜索工具”,根据通缉令抓取目标。

步骤 1:安装和导入 re 模块

Python 内置了 re 模块,用于处理正则表达式。使用前需先导入:

import re  

步骤 2:编写正则表达式

基础案例:提取所有连续数字

假设字符串为:

text = "订单号为 12345,总金额为 99.99 美元,折扣码是 ABC123。"  

要提取所有连续数字(如 123459999123),可以使用模式 \d+

pattern = r"\d+"  
numbers = re.findall(pattern, text)  
print(numbers)  # 输出:['12345', '99', '99', '123']  

元字符详解:理解 \d+ 的含义

  • \d:匹配单个数字字符;
  • +:表示“前面的字符可以重复一次或多次”,因此 \d+ 能匹配连续的数字序列。

扩展案例:处理浮点数

如果字符串包含浮点数(如 99.99),\d+ 会将其拆分为 ['99', '99']。要完整提取浮点数,可以调整正则表达式:

pattern = r"\d+\.\d+"  
numbers = re.findall(pattern, text)  
print(numbers)  # 输出:['99.99']  

进阶技巧:处理复杂场景

案例 1:排除非数字字符干扰

假设字符串中存在非数字字符,例如:

text = "电话号码:+1-555-123-4567,邮箱:user123@example.com"  

目标是提取电话号码中的数字 1234567,但 \d+ 会匹配所有连续数字,包括 15551234567。此时需要更精确的模式:

pattern = r"(\d{3}-\d{3}-\d{4})"  
full_phone = re.findall(pattern, text)  
print(full_phone)  # 输出:['555-123-4567']  

pattern = r"\d+"  
all_numbers = re.findall(pattern, text)  
print(all_numbers)  # 输出:['1', '555', '123', '4567', '123']  

案例 2:处理多行文本

如果文本包含多行,可以添加标志 re.DOTALLre.MULTILINE

text = """  
第一行:价格是 100  
第二行:折扣后 50  
第三行:总计 150  
"""  

pattern = r"\d+"  
numbers = re.findall(pattern, text)  
print(numbers)  # 输出:['100', '50', '150']  

常见问题与解决方案

问题 1:如何匹配科学计数法中的数字?

例如,字符串 "速度为 3.14e5 米/秒" 中的 3.14e5

text = "速度为 3.14e5 米/秒"  
pattern = r"[-+]?\d*\.\d+([eE][-+]?\d+)?"  # 匹配科学计数法  
numbers = re.findall(pattern, text)  
print(numbers)  # 输出:['3.14e5']  

问题 2:如何提取带千位分隔符的数字?

例如 "收入为 1,000,000"

text = "收入为 1,000,000"  
cleaned = re.sub(r"\D", "", text)  # 移除非数字字符  
print(cleaned)  # 输出:1000000  

性能优化与注意事项

1. 预编译正则表达式

如果需要多次使用同一模式,可以预编译以提高效率:

import re  
pattern = re.compile(r"\d+")  
numbers = pattern.findall(text)  

2. 注意边界情况

  • 空字符串:re.findall() 返回空列表。
  • 非数字字符串:确保模式不会误匹配(如 r"\d+""abc" 中返回空列表)。

结论:掌握正则表达式的核心价值

通过本文,你学会了如何用 Python 的正则表达式从字符串中提取数字,并理解了其背后的逻辑。正则表达式不仅是“文本过滤器”,更是解决复杂数据提取问题的工具。

下一步行动建议

  1. 尝试用正则表达式处理自己的文本数据;
  2. 探索更多元字符(如 ?*[])的用法;
  3. 阅读官方文档或教程,深入理解正则表达式语法。

掌握这项技能后,无论是日志分析、数据清洗还是自动化脚本编写,你都将更加得心应手。

最新发布