【问题标题】:How retrieve keyword arguments from a string in python?如何从python中的字符串中检索关键字参数?
【发布时间】:2014-08-02 13:29:01
【问题描述】:

假设我有一个字符串:

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

好的,很酷。但就我而言,我想检索my_string 中的关键字参数。我已经完成了:

 > ATTRS_PATTERN = re.compile(r'{(?P<variable>[_a-z][_a-z0-9]*)}')
 > ATTRS_PATTERN.findall(my_string)
 ['foo', 'bar']

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

【问题讨论】:

  • 请注意,格式说明符可以嵌套一层:'{hello:{world}}'.format(hello=5.123456, world='.2f') --&gt; '5.12'。如果您不跟踪在其他字段中使用了哪些字段,则可能会传入无效的格式说明符,如果您打算格式化字符串,则会引发错误。

标签: python string parsing format


【解决方案1】:

您可以使用string.Formatter.parse 方法。它将字符串拆分为其文字文本组件和字段:

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)]

要检索名称字段,只需遍历结果并收集第二个字段。

请注意,这也将包括位置(编号和未编号)参数。

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

In [1]: import string

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

In [3]: list(formatter.parse('{hello:{world}}'))
Out[3]: [('', 'hello', '{world}', None)]

如果你想得到所有个命名字段(假设只使用命名字段),你必须解析元组中的第二个元素:

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']

(此解决方案将允许任意深度的格式说明符,而只有一层就足够了)。

【讨论】:

  • 嵌套字段名称的优雅解决方案
【解决方案2】:

为什么要重新发明轮子? string.Formatter 具有parse() 功能。

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

【讨论】:

  • 正是我想要的。我误解了parse函数
猜你喜欢
  • 2018-02-13
  • 1970-01-01
  • 2018-11-21
  • 2019-03-13
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
相关资源
最近更新 更多