Python利用正则表达式从字符串提取数字与日期

阿澈
阿澈
发布时间:2026-10-12 | 4人浏览过
原创

本文详细演示如何使用Python内置的re模块及正则表达式从杂乱文本中精准提取数字序列与年月日信息。通过对比match、search与findall函数的差异,掌握核心编译参数与匹配逻辑,并提供直接可用的数字提取与日期抽取代码片段,满足日常数据处理需求。

核心目标与运行准备

在数据处理流程中,非结构化文本常包含需要解析的数值或时间戳。Python自1.5版本起内置了re模块,提供符合Perl风格的正则表达式引擎。本文的目标是借助该模块快速完成两类高频任务:按规则抽取整数/浮点数,以及定位标准格式的日期信息。无需安装第三方库,直接使用内置模块即可。

第1步:掌握基础匹配函数特性

正则操作的核心在于选择正确的匹配入口。实际使用中主要依赖以下三个函数:

  • re.match(pattern, string, flags=0):仅从字符串起始位置尝试匹配。若开头不符合模式则立即返回 None。
  • re.search(pattern, string, flags=0):扫描整个字符串,找到第一个成功匹配项后停止并返回匹配对象。
  • findall(string, ...)(编译后调用)或 re.findall(pattern, string, flags=0):一次性提取所有符合条件的子串,返回列表。若无结果则返回空列表 []。

关键区别:match 关注起点,search 关注首次命中,findall 关注全局收集。提取分散在多处的数字或日期时,应优先使用 findall。

第2步:使用 compile 预编译正则模式

当同一套匹配规则需在多处重复调用时,建议使用 re.compile() 预先构建正则对象。其语法为:

import re
compiled_obj = re.compile(pattern, flags=0)

常用标志参数说明:

  • re.I:忽略大小写
  • re.M:多行模式(改变 ^ 和 $ 的行为)
  • re.S:使 . 能够匹配换行符
  • re.X:开启自由格式,忽略未转义的空格与 # 后的注释,提升复杂模式可读性

第3步:编写数字提取逻辑与对应模式

以下是抽取整数的标准实现。注意:原文代码省略了正则字符串的引号导致无法直接运行,此处已修正为合法语法。

import re

def extract_numbers(text):
    # 匹配整数(支持负数)
    pattern = re.compile(r"-?[1-9]\d*")
    raw_nums = pattern.findall(text)
    return [int(num) for num in raw_nums]

# 示例:text = "价格-125元,折扣30%,剩余库存0"
# 输出:[-125, 30, 0]

根据数据类型不同,正则表达式需调整边界条件。常用模式对照如下:

  • 正整数:[1-9]\d*
  • 负整数:-[1-9]\d*
  • 非负整数:[1-9]\d*|0
  • 正浮点数:[1-9]\d*\.\d*|0\.\d*[1-9]\d*
  • 负浮点数:-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)
  • 通用浮点数:-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)

将上述任一模式传入 re.compile() 即可完成类型限定抽取。

第4步:实现标准年月日格式抽取

针对中文或混合分隔符的时间描述,可通过分组捕获提取 年-月-日 结构:

import re

def extract_date(context_text):
    # 按行过滤空行,取前5段提高检索效率
    segments = [para.strip() for para in context_text.split('\n') if para.strip()][:5]
    for seg in segments:
        # 匹配 YYYY 年/月/日 或 YYYY/MM/DD 等组合
        ret = re.findall(r'(\d{4})\s*[\./年-]\s*(\d{1,2})\s*[\./月-]\s*(\d{1,2})\s*日?', seg)
        if ret:
            y, m, d = ret[0]
            return f"{y}/{m.lstrip('0')}/{d.lstrip('0')}"
    return None

该函数会逐段扫描输入文本,遇到首个匹配的日期即返回标准化格式。若未找到则返回 None。

结果验证与常见排错

完成代码编写后,可通过以下方式确认提取结果是否符合预期:

  1. 观察返回值类型:数字提取函数应返回 list,日期函数返回 str 或 None。打印调试变量可快速核对。
  2. 检查转义字符:正则中的特殊符号(如 ., *, |)若在普通文本中本意不是通配符,必须使用反斜杠 \ 转义,或使用原始字符串前缀 r""。
  3. 处理空匹配:当 findall 返回空列表时,通常是模式贪婪度不足或分隔符写法未覆盖实际文本特征,可先使用在线正则测试工具校验后再放入业务代码。

总结

依托Python内置的 re 模块与合理的正则设计,可以稳定完成从复杂字符串到结构化数据的转换。明确匹配范围、正确书写原始字符串模式、按需启用编译缓存,是保障解析效率的关键。以上就是Python利用正则表达式从字符串提取数字与日期的详细内容,更多关于Python正则处理非结构化数据的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表