[英]How retrieve keyword arguments from a string in python?
假设我有一个字符串:
> 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']
不是很性感 你有更好的主意吗?
为什么要重新发明轮子? string.Formatter
具有parse()函数。
>>> import string
>>> [a[1] for a in string.Formatter().parse('{foo}/{bar}')]
['foo', 'bar']
您可以使用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']
(此解决方案将允许任意深度的格式说明符,而仅一个级别就足够了)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.