如何在 Python 中的字符串中查找格式字符串 {key:format}



现在我有一个字典对象,它的键是这样的:

d ={}
d['fruit'] = 'apple'   # user input from a configuration file
d['availablefruit'] = 'orange'  # generated by the program

我的愿望是,用户可以通过nestget函数设置d['fruit']='{availablefruit:s}'以便利用程序生成的值orange,即:

d['fruit'] = '{availablefruit:s}' # from user input
print d.nestget('fruit', None)   # return orange is applicable

这样做的原因是为了实现一些"自动填充"功能,即用户可以获得预先指定的值(例如 apple)为"水果",或使用机器生成的键availablefruit的值,不知道在调用函数nestget时可用的果实。

问题是:是否有一个很好的函数getformatstringkeys,它可以返回嵌入在字符串{availablefruit:s}中的availablefruit,以便我可以执行字符串的format方法?

def nestget(key, default):
    val = d.get(key, default)
    keys_in_val = getformatstringkeys(val)
    return val.format(**{k:d[k] for k in keys_in_val})

当我测试时,以下内容

'{a:f},{b:f},{c:f}'.format(a=1,b=2,c=3,d=4,e=5)

给出了'1,2,3',所以如果我将整个字典d传递给format使用 val.format(**d),它应该可以工作。但是当字典更大时,它可能会贵得多。

==== 编辑 ====

谢谢用户2357112 -- 你说的是对的。我不是这样想的。实际上format做的是搜索那里提到的键并调用dict.get()并在 Kwargs 被馈送时替换。我打算对参数执行操作以调用函数是多么聪明,而该操作已经由函数本身实现......

如果你有一个在运行时可用于替换的可能字符串的列表,这就是你所需要的。假设您在可用关键字及其预定义值之间有一个字典映射 - 称之为available_fruit - 问题变得很容易:

available_fruit = {'fruit1':'orange', 'fruit2':'banana'}
def get_format_string_keys(val):
    results = []
    for k, v in available_fruit.iteritems():
        if k in val:
            results.append((k,v))
    return results

这为我们提供了:

>>> test_string = 'fruit1 is my favorite fruit'
>>> results = get_format_string_keys(test_string)
>>> for r in results:
...    print r
...
('fruit1', 'orange') 

在此基础上,在nestget函数中,您可以简单地:

>>> for r in results:
...    test_string.replace(*r)
...
'orange is my favorite fruit'

最新更新