使用.format格式化字符串时检索预期的键名

时间:2016-08-25 18:47:25

标签: python python-3.x string-formatting

如何从字符串中检索预期的格式键名?

让我说我有:

"This string expects {expected}"

如果输入错误的键名,python会抛出一个显示预期名称的KeyError。

"This string expects {expected}".format(whoops="wrong key")
KeyError: 'expected'

有没有办法测试这个没有正则表达式或(呃)故意抛出KeyError?我查看了字符串文档,但没有任何内容跳出来。

编辑1:

我不想压制错误,也不想用None / empty字符串静默填充它。我想使用预期的keyname来正确格式化字符串。

我可以通过将字符串映射到dict中的keyname来重新编写它,但是如果有办法在事后找到它,我希望避免这种情况。

正则表达式是一个很好的解决方案,但在这一点上,我只是好奇。

3 个答案:

答案 0 :(得分:4)

你可以这样使用Formatter.parse

>>> s="{a} {b} {c}"
>>> list(string.Formatter.parse("",s))
[('', 'a', '', None), (' ', 'b', '', None), (' ', 'c', '', None)]
>>> [t[1] for t in string.Formatter.parse("",s)]
['a', 'b', 'c']

答案 1 :(得分:2)

听着,这是一个非常好的问题,
它让我在最后5分钟左右忙碌

这是我写的一个函数来完成这项工作 没有正则表达式,但是例外情况。在这里:

def findKeys(s):
    keys = {}
    while True:
        try:
            s.format(**keys)
            return [*keys.keys()]
        except KeyError as e:
            k, = e.args
            keys[k] = ''

它返回字符串中所有键的列表。

答案 2 :(得分:0)

要找到您需要将其包装在try / except子句中的密钥名称。

try:
    my_string = "This string expects {expected}".format(whoops="wrong key")
except KeyError as e:
    print(e)  # the variable e is your keyname

编辑:另一种方法可能是找到字符串中的花括号,并使用切片找到您的键名。下面的示例仅查找键名的第一个实例,但可以轻松修改以查找其他键。

s = "This string expects {expected}"
key_name = s[s.find('{') + 1: s.find('}')]