如何从Python格式字符串中提取关键字?

问题描述

您可以使用string.Formatter()一个字符串,解析出的领域,与Formatter.parse()方法

from string import Formatter

fieldnames = [fname for _, fname, _, _ in Formatter().parse(yourstring) if fname]

演示:

>>> from string import Formatter
>>> yourstring = "path/to/{self.category}/{self.name}"
>>> [fname for _, fname, _, _ in Formatter().parse(yourstring) if fname]
['self.category', 'self.name']
>>> yourstring = "non-keyword {keyword1} {{escaped brackets}} {} {keyword2}"
>>> [fname for _, fname, _, _ in Formatter().parse(yourstring) if fname]
['keyword1', 'keyword2']

您可以进一步解析这些字段名称。为此,您可以使用str._formatter_field_name_split()方法(Python 2)/_string.formatter_field_name_split()函数(Python 3)(此内部实现细节未公开;Formatter.get_field()在内部使用)。此函数返回名称第一部分 ,将在传递给的参数中查找该名称第一部分str.format(),并为该字段的其余部分生成一个生成器。

生成器产生(is_attribute, name)元组is_attribute如果将姓氏视为属性,则为true;如果要使用以下项查找,则为false obj[name]

try:
    # Python 3
    from _string import formatter_field_name_split
except ImportError:
    formatter_field_name_split = str._formatter_field_name_split
from string import Formatter

field_references = {formatter_field_name_split(fname)[0]
 for _, fname, _, _ in Formatter().parse(yourstring) if fname}

演示:

>>> from string import Formatter
>>> from _string import formatter_field_name_split
>>> yourstring = "path/to/{self.category}/{self.name}"
>>> {formatter_field_name_split(fname)[0]
...  for _, fname, _, _ in Formatter().parse(yourstring) if fname}
{'self'}

请注意,此函数Formatter()该类的内部实现细节的一部分,可以在不通知的情况下从Python进行更改或删除,甚至在其他Python实现中也不可用。

解决方法

我想在API中提供自动字符串格式,例如:

my_api("path/to/{self.category}/{self.name}",...)

可以替换为格式化字符串中标注的属性值。


如何从Python格式字符串中提取关键字参数:

"non-keyword {keyword1} {{escaped brackets}} {} {keyword2}" => 'keyword1','keyword2'