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

retrieve expected key name when formatting a string with .format

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

假设我有:

"This string expects {expected}"

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

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

有没有一种方法可以在不使用正则表达式或(呃)故意抛出 KeyError 的情况下对此进行测试?我查看了字符串文档,但没有发现任何问题。

编辑 1:

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

我可以通过将字符串映射到字典中的键名来在上游对其进行返工,但如果事后有办法找到它,我希望避免这种情况。

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

要查找键名,您需要将其包装在 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('}')]

你可以这样使用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']

听着,这是一个很好的问题,
这让我忙了最后 5 分钟左右

这是我为完成这项工作而编写的函数。
没有正则表达式,但有例外。开始了:

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

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