如何用正则提取文件名中下划线与句点之间的日期字符串
正则提取文件名日期字段方案
问题背景
需要从固定格式的文件名中,提取最后一个下划线和文件扩展名句点之间的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
相关产品推荐
相关产品推荐

