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

如何在python中从字符串检索关键字参数?,python,string,parsing,format,Python,String,Parsing,Format,比方说,我有一个字符串: > 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(m

比方说,我有一个字符串:

  > 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']
>ATTRS\u PATTERN=re.compile(r'{(?P[\u a-z][\u a-z0-9]*]))
>ATTRS\u PATTERN.findall(我的字符串)
['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字段,只需迭代结果并收集第二个字段

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

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

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

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

为什么要重新发明轮子<代码>字符串。格式化程序具有此功能

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

请注意,格式说明符可以嵌套在一个级别:
'{hello:{world}'。格式(hello=5.123456,world='.2f')-->'5.12'
。如果您不跟踪在其他字段中使用的字段,则可能会传递无效的格式说明符,如果您计划格式化字符串,则会引发错误。您不想使用
parse
?正是我想要的。我误解了
parse
function嵌套字段名的优雅解决方案