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

Dol*_*lph 3 python regex string string-formatting

我发现这是一个难以理解的问题,因此就是例子.不过,我基本上被赋予任意格式的字符串,我需要去(有效)从数据库中获取相应的值,以动态地建立一个相关的映射对象.

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

>>> 'Hello, %(first-name)s!' % {'first-name': 'Dolph'}
'Hello, Dolph!'
Run Code Online (Sandbox Code Playgroud)

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

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

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

基于字符串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]
Run Code Online (Sandbox Code Playgroud)

但这并没有完全回归我所期望的(field_name根据文档的s 列表).

Sve*_*ach 6

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

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

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

print 'Hello, %(first-name)s!' % Mapper()
Run Code Online (Sandbox Code Playgroud)

版画

Hello, first-name!
Run Code Online (Sandbox Code Playgroud)