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

Python 3.11.2中如何遍历字符串内的转换说明符?

提取模板字符串的格式化说明符并验证

1. 针对旧式%格式化的解决方案

提取说明符

要从%(name)s %(age)s这类模板中提取name、age这类说明符,需要用正则表达式匹配符合%(xxx)s格式的片段,捕获其中的标识符部分:

import re

template = "%(name)s %(age)s"
values = {
    "name": "Jack",
    "age": "50",
    "gender": "male",
}

# 匹配%(xxx)s格式,捕获括号内的标识符
specifiers = re.findall(r"%\((\w+)\)s", template)
# 去重避免重复验证同一说明符
specifiers = list(set(specifiers))

验证与格式化

提取完成后,逐一检查说明符是否存在于values的键集合中,验证通过再执行格式化:

for spec in specifiers:
    if spec not in values:
        raise ValueError(f"模板说明符 '{spec}' 不存在于values中!")

# 执行格式化
result = template % values
print(result)  # 输出: Jack 50

2. 使用新式字符串格式化的方案

如果可以切换到新式格式化,推荐以下两种更安全的方案:

方案一:str.format()

提取占位符

str.format()的模板格式为{name} {age},同样用正则提取占位符:

template = "{name} {age}"
values = {
    "name": "Jack",
    "age": "50",
    "gender": "male",
}

# 匹配{xxx}格式,捕获括号内的标识符
specifiers = re.findall(r"\{(\w+)\}", template)
specifiers = list(set(specifiers))

验证与格式化

for spec in specifiers:
    if spec not in values:
        raise ValueError(f"模板占位符 '{spec}' 不存在于values中!")

result = template.format(**values)
print(result)  # 输出: Jack 50

方案二:string.Template类

Python标准库的string.Template专为外部模板场景设计,语法为$name或${name},无需手动写正则即可提取占位符:

from string import Template

template = "$name $age"
values = {
    "name": "Jack",
    "age": "50",
    "gender": "male",
}

# 创建Template实例并提取所有占位符
t = Template(template)
specifiers = t.get_identifiers()

# 验证
for spec in specifiers:
    if spec not in values:
        raise ValueError(f"模板占位符 '{spec}' 不存在于values中!")

# 执行格式化
result = t.substitute(values)
print(result)  # 输出: Jack 50

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:45:45