多格式文件名日期提取需求:统一转换为mm-dd-yyyy格式
通用日期提取与格式化解决方案
针对你需要从工作簿文件名提取多种格式日期并转为mm-dd-yyyy的需求,不需要单独编写多份脚本,可通过正则匹配+统一解析转换的方式实现通用方案,以下是具体实现:
核心思路
用正则表达式覆盖所有你遇到的日期格式,从文件名中匹配出日期字符串,再通过日期解析工具统一转换为目标格式;对于无具体日的日期(如mm-yyyy、MMMM yyyy),默认取当月1号补全。
适配你列出格式的正则匹配规则
针对你提到的6种格式,对应的正则表达式如下:
MMM dd yyyy(例:Jan 01 2024):\b(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+\d{1,2}\s+\d{4}\bmm_dd_yyyy(例:03_15_2024):\b\d{1,2}_\d{1,2}_\d{4}\bm.dd.yy(例:1.04.22):\b\d{1,2}\.\d{2}\.\d{2}\byyyymmdd(例:20231231):\b\d{8}\bmm-yyyy(例:07-2023):\b\d{1,2}-\d{4}\bMMMM yyyy(例:December 2022):\b(January|February|March|April|May|June|July|August|September|October|November|December)\s+\d{4}\b
Python代码实现
以下代码可直接用于提取并格式化日期,支持你列出的所有格式,且兼容日期在文件名任意位置的情况:
import re from dateutil.parser import parse from os.path import basename def extract_and_format_date(filename): # 定义所有目标格式的正则表达式 patterns = [ # MMM dd yyyy r'\b(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+\d{1,2}\s+\d{4}\b', # mm_dd_yyyy r'\b\d{1,2}_\d{1,2}_\d{4}\b', # m.dd.yy r'\b\d{1,2}\.\d{2}\.\d{2}\b', # yyyymmdd r'\b\d{8}\b', # mm-yyyy r'\b\d{1,2}-\d{4}\b', # MMMM yyyy r'\b(January|February|March|April|May|June|July|August|September|October|November|December)\s+\d{4}\b' ] # 获取纯文件名(去掉路径) filename = basename(filename) matched_date_str = None # 遍历正则,匹配第一个符合的日期 for pattern in patterns: match_result = re.search(pattern, filename, re.IGNORECASE) if match_result: matched_date_str = match_result.group() break if not matched_date_str: return "未匹配到日期" # 解析日期并处理无日的情况 try: # 处理mm-yyyy格式,补全日为01 if '-' in matched_date_str and len(matched_date_str) == 7: target_date = parse(f"{matched_date_str}-01") # 处理MMMM yyyy格式,补全日为01 elif len(matched_date_str.split()) == 2 and len(matched_date_str.split()[0]) > 3: target_date = parse(f"{matched_date_str} 01") # 其他格式直接解析 else: target_date = parse(matched_date_str) # 转换为mm-dd-yyyy格式 return target_date.strftime("%m-%d-%Y") except ValueError: return "日期解析失败" # 测试示例 test_files = [ "Sales_Jan 05 2023.xlsx", "Inventory_03_15_2024.csv", "Invoice_1.04.22.docx", "Backup_20231231.zip", "Summary_07-2023.pdf", "Budget_December 2022.xls" ] for file in test_files: result = extract_and_format_date(file) print(f"{file} → {result}")
补充说明
- 如果后续遇到新的日期格式,只需在
patterns列表中添加对应的正则表达式即可; dateutil.parser能自动处理大部分日期歧义,但如果存在类似01-02-2024这种可能混淆日/月的格式,可在parse函数中添加dayfirst=True或yearfirst=True参数指定解析优先级;- 若需用VBA在Excel中直接处理,可使用VBA的
RegExp对象实现正则匹配,再通过CDate函数解析日期,逻辑与上述Python代码一致。
内容的提问来源于stack exchange,提问作者Dio
相关产品推荐
相关产品推荐

