【问题标题】:retrieve expected key name when formatting a string with .format [duplicate]使用 .format 格式化字符串时检索预期的键名 [重复]
【发布时间】:2017-01-02 07:44:10
【问题描述】:

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

假设我有:

"This string expects {expected}"

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

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

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

编辑 1:

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

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

Regex 会是一个很好的解决方案,但在这一点上,我只是好奇。

【问题讨论】:

  • @CoDEmanX 询问有关抑制错误的问题。我在问如何找到键名。
  • 所以你不知道字符串是什么样子的?在您的示例中,预期的名称就在您的眼前,所以想知道您究竟想在这里解决什么问题。
  • @CoDEmanX 我还应该如何举例说明一个我事先不知道其内容的变量?
  • 是的,使用 string.Formatter,stackoverflow.com/a/30418220/2141635
  • Ohad 的解决方案绝对是正确的选择。尽管如此,我还是在这里发布了一个代码 sn-p,因为提出这个非常有趣:stackoverflow.com/a/39153155/2044940

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


【解决方案1】:

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

【讨论】:

  • 这符合我的要求。谢谢!
  • [t[1] for t in string.Formatter.parse("",s) if t[1]] 过滤掉未命名占位符导致的空字符串。
  • @CoDEmanX 如果你想过滤掉它们。有些人可能想知道那里有一个未命名的占位符。
【解决方案2】:

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

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

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

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

【讨论】:

【解决方案3】:

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

【讨论】:

  • 我已经考虑过了,但我的问题是如何在不引发错误的情况下完成此操作。
猜你喜欢
  • 1970-01-01
  • 2022-10-01
  • 1970-01-01
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多