在python中如何从字符串中检索关键字参数?

2024-05-16 07:04:09 发布

您现在位置:Python中文网/ 问答频道 /正文

比如说,我有一条线:

  > my_string = '{foo}/{bar}'
  > my_string.format(foo='foo', bar='bar')
  'foo/bar'

好吧,酷。但在我的例子中,我想检索my_string中的关键字参数。我已经做到了:

^{pr2}$

不是很性感。你有更好的主意吗?在


Tags: format参数stringfoomybar关键字例子
2条回答

为什么要改头换面?string.Formatter具有parse()功能。在

>>> import string
>>> [a[1] for a in string.Formatter().parse('{foo}/{bar}')]
['foo', 'bar']

您可以使用^{}方法。它将字符串拆分为文本组件和字段:

In [1]: import string

In [2]: formatter = string.Formatter()

In [3]: text = 'Here is some text with {replacement} fields {}'

In [4]: list(formatter.parse(text))
Out[4]: 
[('Here is some text with ', 'replacement', '', None),
 (' fields ', '', '', None)]

要检索names字段,只需迭代结果并收集第二个字段。在

请注意,这将包括位置参数(有编号和无编号)。在

请注意,这不包括嵌套的参数:

^{pr2}$

如果要获取所有命名字段(假设只使用命名字段),则必须解析元组中的第二个元素:

In [4]: def get_named_fields(text):
   ...:     formatter = string.Formatter()
   ...:     elems = formatter.parse(text)
   ...:     for _, field, spec, _ in elems:
   ...:         if field:
   ...:             yield field
   ...:         if spec:
   ...:             yield from get_named_fields(spec)
   ...:             

In [5]: list(get_named_fields('{hello:{world}}'))
Out[5]: ['hello', 'world']

(这个解决方案允许任意深度的格式说明符,而只有一个级别就足够了)。在

相关问题 更多 >