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

使用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-11
  • member:固定为rWiXpY格式,其中W、X、Y为数字,比如r1i1p1
  • scenario:固定包含rcp后跟2个数字,比如rcp45
  • start/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))

正则原理讲解

  1. 命名捕获组:每个字段用(?P<name>pattern)定义,匹配结果会自动映射为字典的键值对,直接对应字段名。
  2. 字段匹配规则:
    • [^_]+:匹配任意非下划线字符,适用于无格式约束的字段(如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)。
  3. 可选字段处理:(?P<fid>[^_.]+)?中的?表示该组可选,[^_.]+确保匹配到的fid不包含下划线和点号;_?表示start-end和fid之间的下划线可选(因为fid可能不存在)。
  4. 边界匹配:^和$确保匹配整个文件名,避免部分匹配;\.nc$确保文件名以.nc结尾。
  5. re.VERBOSE模式:允许正则表达式换行加注释,大幅提升可读性,且不影响匹配逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:25:13