如何调整Python文件名日期提取代码以支持带短横线的日期格式?
解决带短横线日期格式的提取问题
你的原函数核心问题是仅通过日期格式字符串的长度生成正则表达式,比如把YYYY-MM-DD当成长度为10的字符串,生成\d{10},但实际日期里的短横线不是数字,自然匹配失败。要解决这个问题,我们需要为每种日期格式预定义对应的正则规则,而非靠长度推导。
修改后的函数如下:
import re def extract_date_from_filename(filename, pattern): """ Extracts the date part from the filename based on the provided pattern. Returns the date as a string, or None if no match is found. """ # 定义所有支持的日期格式对应的正则表达式 date_format_map = { 'YYYYMMDD': r'\d{8}', 'MMDD': r'\d{4}', 'DDMM': r'\d{4}', 'YYYY': r'\d{4}', 'MM': r'\d{2}', 'DD': r'\d{2}', 'YYYY-MM-DD': r'\d{4}-\d{2}-\d{2}', 'YYYY-MM': r'\d{4}-\d{2}', 'MM-DD': r'\d{2}-\d{2}' } # 提取模式中的日期格式部分 date_pattern_match = re.search(r'\{(.*?)\}', pattern) if not date_pattern_match: return None # 未找到日期格式标记 date_format = date_pattern_match.group(1) # 检查是否支持该日期格式 if date_format not in date_format_map: return None # 生成匹配用的正则表达式:转义模式中的特殊字符,替换日期标记为对应正则 escaped_pattern = re.escape(pattern) regex_pattern = escaped_pattern.replace(r'\{' + date_format + r'\}', f'({date_format_map[date_format]})') # 匹配文件名中的日期 match = re.search(regex_pattern, filename) return match.group(1) if match else None
关键修改点:
- 新增
date_format_map字典,为每种需要支持的日期格式绑定精准的正则规则,比如YYYY-MM-DD对应\d{4}-\d{2}-\d{2},能正确匹配带短横线的日期。 - 增加了对模式中无日期标记、或日期格式不支持的情况处理,避免报错。
- 替换原有的正则生成逻辑,不再依赖日期格式字符串的长度,直接使用预定义的正则规则。
测试示例:
# 测试纯数字日期 print(extract_date_from_filename("File_20240621", "File_{YYYYMMDD}")) # 输出: 20240621 # 测试带短横线的完整日期 print(extract_date_from_filename("Report_2024-06-21.pdf", "Report_{YYYY-MM-DD}.pdf")) # 输出: 2024-06-21 # 测试月日格式 print(extract_date_from_filename("Log_06-21.txt", "Log_{MM-DD}.txt")) # 输出: 06-21 # 测试年格式 print(extract_date_from_filename("Archive_2024.zip", "Archive_{YYYY}.zip")) # 输出: 2024
内容的提问来源于stack exchange,提问作者tootiefairy
相关产品推荐
相关产品推荐

