使用Python正则表达式解析下划线分隔的参数化文件名
用Python正则解析参数化NetCDF文件名
文件名格式说明
参数化的文件名格式如下:
"{variable}_{domain}_{GCMsource}_{scenario}_{member}_{RCMsource}_{RCMversion}_{frequency}_{start}-{end}_{fid}.nc"
示例文件名:
"pr_EUR-11_CNRM-CERFACS-CNRM-CM5_rcp45_r1i1p1_CLMcom-CCLM4-8-17_v1_day_20060101-20101231.nc"
注意:
{start}-{end}用连字符分隔,而非下划线;{fid}为可选字段,示例中省略了该字段。
所有字段以下划线分隔,字段内部无下划线,格式可预测但内容可变。
字段约束规则
各字段有明确的格式约束:
domain:固定为3个字母+连字符+2个数字,比如EUR-11member:固定为rWiXpY格式,其中W、X、Y为数字,比如r1i1p1scenario:固定包含rcp后跟2个数字,比如rcp45start/end:固定为8位数字(YYYYMMDD格式),比如20060101
期望解析结果
将文件名解析为字典,键对应格式字符串中的字段名,值为文件名中的对应内容,可选字段fid不存在时设为None。示例解析结果:
{ "variable": "pr", "domain": "EUR-11", "GCMsource": "CNRM-CERFACS-CNRM-CM5", "scenario": "rcp45", "member": "r1i1p1", "RCMsource": "CLMcom-CCLM4-8-17", "RCMversion": "v1", "frequency": "day", "start": "20060101", "end": "20101231", "fid": None }
实现方案与正则原理
Python代码实现
import re def parse_nc_filename(filename): # 定义正则模式,命名捕获组对应字段名 pattern = r""" ^(?P<variable>[^_]+)_ (?P<domain>[A-Za-z]{3}-\d{2})_ (?P<GCMsource>[^_]+)_ (?P<scenario>rcp\d{2})_ (?P<member>r\d+i\d+p\d+)_ (?P<RCMsource>[^_]+)_ (?P<RCMversion>[^_]+)_ (?P<frequency>[^_]+)_ (?P<start>\d{8})-(?P<end>\d{8})_? (?P<fid>[^_.]+)?\.nc$ """ # 编译正则,忽略空格和注释(re.VERBOSE模式) regex = re.compile(pattern, re.VERBOSE) match = regex.match(filename.strip('"')) # 去掉文件名两侧的引号 if not match: return None # 转换为字典,处理可选字段fid result = match.groupdict() # 如果fid捕获到空值,设为None result['fid'] = result['fid'] if result['fid'] is not None else None return result # 测试示例 test_filename = '"pr_EUR-11_CNRM-CERFACS-CNRM-CM5_rcp45_r1i1p1_CLMcom-CCLM4-8-17_v1_day_20060101-20101231.nc"' print(parse_nc_filename(test_filename))
正则原理讲解
- 命名捕获组:每个字段用
(?P<name>pattern)定义,匹配结果会自动映射为字典的键值对,直接对应字段名。 - 字段匹配规则:
[^_]+:匹配任意非下划线字符,适用于无格式约束的字段(如variable、GCMsource等),确保不会跨下划线分隔符。[A-Za-z]{3}-\d{2}:严格匹配domain的3字母+连字符+2数字格式。rcp\d{2}:严格匹配scenario的rcp+2数字格式。r\d+i\d+p\d+:严格匹配member的r数字i数字p数字格式。\d{8}:匹配start和end的8位数字(YYYYMMDD)。
- 可选字段处理:
(?P<fid>[^_.]+)?中的?表示该组可选,[^_.]+确保匹配到的fid不包含下划线和点号;_?表示start-end和fid之间的下划线可选(因为fid可能不存在)。 - 边界匹配:
^和$确保匹配整个文件名,避免部分匹配;\.nc$确保文件名以.nc结尾。 - re.VERBOSE模式:允许正则表达式换行加注释,大幅提升可读性,且不影响匹配逻辑。
内容的提问来源于stack exchange,提问作者ogb119
相关产品推荐
相关产品推荐

