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
相关产品推荐
相关产品推荐

