You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则提取文件名中下划线与句点之间的日期字符串

正则提取文件名日期字段方案

问题背景

需要从固定格式的文件名中,提取最后一个下划线和文件扩展名句点之间的8位日期字段,文件名样例如下:

['1 120836_1_20210101.csv',
 '1 120836_1_20210108.csv',
 '1 120836_20210101.csv',
 '1 120836_20210108.csv',
 '10 120836_1_20210312.csv',
 '10 120836_20210312.csv',
 '11 120836_1_20210319.csv',
 '11 120836_20210319.csv',
 '12 120836_1_20210326.csv',
 ...
]

原有代码的正则(?<=_)\d{}(?=\d*\.)无法得到正确结果,核心问题有两个:

  • \d{}未指定匹配长度,属于非法正则语法
  • 前瞻规则(?=\d*\.)没有限制数字长度和位置,会把下划线后其他非日期的数字段(比如文件名里的序号1)误匹配进来

正确实现

正则方案

观察文件名规律:要提取的8位日期,是紧挨着.csv后缀、离句点最近的下划线后的连续数字,直接用正则r'_(\d{8})\.'即可,逻辑拆解:

  • 先匹配下划线字符_
  • 用捕获组提取连续8位数字(\d{8}),这部分就是目标日期
  • 匹配数字后紧跟的句点.,确保提取的数字就在扩展名前,不会误抓前面的序号

可直接运行的代码:

import re

files = [
    '1 120836_1_20210101.csv',
    '1 120836_1_20210108.csv',
    '1 120836_20210101.csv',
    '1 120836_20210108.csv',
    '10 120836_1_20210312.csv',
    '10 120836_20210312.csv',
    '11 120836_1_20210319.csv',
    '11 120836_20210319.csv',
    '12 120836_1_20210326.csv'
]

dates = []
# 提前编译正则,批量处理时效率更高
date_pattern = re.compile(r'_(\d{8})\.')
for file in files:
    match_ret = date_pattern.search(file)
    if match_ret:
        dates.append(match_ret.group(1))

print(dates)

运行后输出结果完全符合预期:

['20210101', '20210108', '20210101', '20210108', '20210312', '20210312', '20210319', '20210319', '20210326']

非正则可选方案

如果文件名格式完全固定,不用正则的写法更简单、运行效率也更高:

dates = []
for file in files:
    # 先去掉.csv后缀,再按下划线拆分,取最后一段就是日期
    date_val = file.removesuffix('.csv').split('_')[-1]
    dates.append(date_val)

内容的提问来源于stack exchange,提问作者allen56

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:09:32