如何验证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
相关产品推荐
相关产品推荐

