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

多格式文件名日期提取需求:统一转换为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}\b
  • mm_dd_yyyy(例:03_15_2024):\b\d{1,2}_\d{1,2}_\d{4}\b
  • m.dd.yy(例:1.04.22):\b\d{1,2}\.\d{2}\.\d{2}\b
  • yyyymmdd(例:20231231):\b\d{8}\b
  • mm-yyyy(例:07-2023):\b\d{1,2}-\d{4}\b
  • MMMM 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}")

补充说明

  1. 如果后续遇到新的日期格式,只需在patterns列表中添加对应的正则表达式即可;
  2. dateutil.parser能自动处理大部分日期歧义,但如果存在类似01-02-2024这种可能混淆日/月的格式,可在parse函数中添加dayfirst=True或yearfirst=True参数指定解析优先级;
  3. 若需用VBA在Excel中直接处理,可使用VBA的RegExp对象实现正则匹配,再通过CDate函数解析日期,逻辑与上述Python代码一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 00:57:11