您可以使用
string.Formatter()类的一个字符串,解析出的领域,与
Formatter.parse()方法:
from string import Formatterfieldnames = [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_splitexcept importError: formatter_field_name_split = str._formatter_field_name_splitfrom string import Formatterfield_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实现中也不可用。



