如何用Python正则表达式严格校验指定格式的文件名?
严格校验文件名格式的Python实现
首先明确你需要的严格格式规则:
- 前缀为一个或多个英文字母(如示例中的
abc) - 下划线后接合法的英文月份名称(全称或常用缩写均可)
- 月份名称后必须跟单个数字(0-9)
- 下划线后接小写的
v加单个数字(0-9) - 后缀固定为
.xlsx,且整个文件名无多余字符
问题分析
你之前的正则r^[A-Za-z]+_[A-Za-z0-9]+_v[0-9]+\.xlsx$存在两个核心问题:
- 月份部分用
[A-Za-z0-9]+过于宽松,允许非月份的字母数字组合(比如123、abc12) [0-9]+会匹配多个数字,不符合你要求的单个数字限制
解决方案
使用re.fullmatch()确保完整匹配,并编写严格限定月份的正则表达式:
import re def validate_filename(filename): # 正则规则:限定合法月份(全称/缩写)、单个数字、完整匹配 strict_pattern = r'^[A-Za-z]+_(January|February|March|April|May|June|July|August|September|October|November|December|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[0-9]_v[0-9]\.xlsx$' # 启用IGNORECASE支持大小写不敏感(如V2、JAN1也能匹配),不需要可移除该标志 match_result = re.fullmatch(strict_pattern, filename, flags=re.IGNORECASE) return match_result is not None # 测试用例 test_cases = [ "abc_Jan1_v2.xlsx", # 合法 "sales_October5_v0.xlsx", # 合法 "abc_123_v1.xlsx", # 非法:无合法月份 "abc_Jan12_v3.xlsx", # 非法:月份后是两位数字 "abc_Jan1_v3.docx", # 非法:后缀错误 "XYZ_Sep9_V4.xlsx" # 合法(大小写不敏感) ] for fname in test_cases: status = "✅ 合法" if validate_filename(fname) else "❌ 非法" print(f"{fname}: {status}")
自定义调整
- 如果前缀是固定的
abc而非任意字母,将正则开头的[A-Za-z]+替换为abc即可 - 如果不需要大小写敏感,移除
flags=re.IGNORECASE,此时v必须为小写,月份名称需与正则内的大小写完全一致 - 如果只需要支持月份全称或仅支持缩写,修改正则中的月份分组即可(比如只保留
Jan|Feb|...|Dec)
内容的提问来源于stack exchange,提问作者Meghna Panda
相关产品推荐
相关产品推荐

