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

Python中string.Template转正则:自定义文件路径解析需求

实现自定义模板转正则匹配并返回groupdict的方案

要实现你需要的文件路径解析器,核心思路是把自定义模板转换成对应的正则表达式,同时区分命名捕获组(对应返回字典的键值)和非捕获组(忽略匹配结果),并自动处理模板中的固定分隔符(如-、_、/等)。

核心实现逻辑

  1. 模板转义:先转义模板中的正则特殊字符(如.、*等),避免干扰正则匹配。
  2. 非捕获组处理:将$[ignore]这类格式替换为正则的非捕获组(?:匹配规则),这类组不会出现在最终的groupdict中。
  3. 命名捕获组处理:将$Name这类格式替换为正则的命名捕获组(?P<Name>匹配规则),匹配结果会以键值对形式存入groupdict。
  4. 完整匹配:生成的正则会强制匹配整个输入字符串,避免部分匹配的情况。

代码实现

import re

def parse_template(template, input_str, var_pattern=r'.*?'):
    # 处理模板中的字面量$:将$$替换为单个$
    template = template.replace('$$', '$')
    # 转义模板中的正则特殊字符(除$、字母、数字、_、-外)
    escaped_template = re.sub(r'([^\w\$_\-])', r'\\\1', template)
    # 替换非捕获组 $[xxx] 为正则非捕获结构
    escaped_template = re.sub(r'\$\[(\w+)\]', rf'(?:{var_pattern})', escaped_template)
    # 替换命名捕获组 $xxx 为正则命名捕获结构
    escaped_template = re.sub(r'\$(\w+)', rf'(?P<\1>{var_pattern})', escaped_template)
    # 生成完整匹配的正则模式
    regex_pattern = f'^{escaped_template}$'
    # 执行匹配并返回groupdict(无匹配则返回None)
    match = re.match(regex_pattern, input_str)
    return match.groupdict() if match else None

测试示例

示例1:使用-分隔符的模板

result = parse_template("$Name1-$Name2", "foo-bar")
print(result)  # 输出: {'Name1': 'foo', 'Name2': 'bar'}

示例2:使用_分隔符的模板

result = parse_template("$Name1_$Name2", "foo_bar")
print(result)  # 输出: {'Name1': 'foo', 'Name2': 'bar'}

示例3:包含非捕获组的模板

result = parse_template("$[ignore]_$keep", "xxx_foo")
print(result)  # 输出: {'keep': 'foo'}

示例4:文件路径场景(限制变量不包含路径分隔符)

# 限制变量匹配除/外的字符,避免跨目录匹配
result = parse_template("$dir/$file.txt", "docs/readme.txt", var_pattern=r'[^/]+')
print(result)  # 输出: {'dir': 'docs', 'file': 'readme'}

注意事项

  • 如果需要在模板中使用字面量$,请写成$$,函数会自动将其转换为单个$。
  • var_pattern参数可以自定义变量的匹配规则,比如文件路径场景下用[^/]+避免匹配路径分隔符,数字场景下用\d+等。
  • 模板中的分隔符如果是正则特殊字符(如.、+),函数会自动转义,无需手动处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:35:16