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

如何验证Blob存储中文件名的日期为MMDDYYYY格式?

问题解决:验证文件名中的MMDDYYYY格式日期

你的核心问题是原正则仅匹配8位数字,无法区分合法的MMDDYYYY格式(月份必须是01-12)。以下是两种解决方案:


方案1:优化正则表达式(基础验证)

通过限制月份范围为01-12,同时对日期做基础范围限制,可快速排除像29082024这种非法月份的情况。

修正后的正则:

pattern = r'Supervisor_(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])[0-9]{4}_[0-9]{5}\.parquet'

各部分说明:

  • (0[1-9]|1[0-2]):匹配合法月份(01-09或10-12)
  • (0[1-9]|[12][0-9]|3[01]):匹配合法日期(01-09、10-29、30-31)
  • \.parquet:转义.,避免匹配任意字符(原正则存在此漏洞)

测试代码:

import re

def is_valid_filename(filename):
    pattern = r'Supervisor_(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])[0-9]{4}_[0-9]{5}\.parquet'
    return re.fullmatch(pattern, filename) is not None

# 测试用例
print(is_valid_filename("Supervisor_08292024_095618.parquet"))  # 输出True(合法)
print(is_valid_filename("Supervisor_29082024_095618.parquet"))  # 输出False(月份29非法)

方案2:结合datetime模块(精确验证)

纯正则无法完美处理闰年、不同月份的天数差异(比如4月没有31天),使用Python的datetime解析日期是更可靠的方式。

实现代码:

import re
from datetime import datetime

def is_valid_filename(filename):
    # 先提取日期部分
    match = re.match(r'Supervisor_(\d{2})(\d{2})(\d{4})_\d{5}\.parquet', filename)
    if not match:
        return False
    # 尝试解析为MMDDYYYY格式的日期
    month, day, year = map(int, match.groups())
    try:
        datetime(year, month, day)
        return True
    except ValueError:
        return False

# 测试用例
print(is_valid_filename("Supervisor_08292024_095618.parquet"))  # True
print(is_valid_filename("Supervisor_29082024_095618.parquet"))  # False(月份非法)
print(is_valid_filename("Supervisor_04312024_095618.parquet"))  # False(4月无31天)
print(is_valid_filename("Supervisor_02292023_095618.parquet"))  # False(2023非闰年)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 01:22:17