如何从Python(旧版)格式字符串中提取字段名称?

时间:2012-02-25 20:19:00

标签: python regex string string-formatting

我发现这是一个难以理解的问题,因此就是例子。但是,我基本上被赋予arbitrary format strings,我需要(有效地)从数据库中获取适当的值,以便动态地构建相关的映射对象。

给定一个期望映射对象的格式字符串,例如:

>>> 'Hello, %(first-name)s!' % {'first-name': 'Dolph'}
'Hello, Dolph!'

我正在寻找下面的'infer_field_names()'的实现:

>>> infer_field_names('Hello, %(first-name)s! You are #%(customer-number)d.')
['first-name', 'customer-number']

我知道我可以编写正则表达式(甚至尝试解析异常消息!),但我希望现有的API调用可以用来代替..?

基于string Formatter docs,我认为这样可行:

>>> import string
>>> format_string = 'Hello, %(first-name)s! You are #%(customer-number)d.'
>>> [x[1] for x in string.Formatter().parse(format_string)]
[None]

但这并没有完全回复我所期望的(按照文档列出的field_name s。)

1 个答案:

答案 0 :(得分:6)

当使用%运算符格式化字符串时,右操作数不必是字典 - 它只需要是一些对象,将所需的字段名称映射到应该被替换的值。所以你需要做的就是编写一个带有重新定义的__getitem__()的类,它从数据库中检索值。

这是一个毫无意义的例子:

class Mapper(object):
    def __getitem__(self, item):
        return item   

print 'Hello, %(first-name)s!' % Mapper()

打印

Hello, first-name!