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

发布于 2021-01-29 19:10:28

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

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

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


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

"non-keyword {keyword1} {{escaped brackets}} {} {keyword2}" => 'keyword1', 'keyword2'
关注者
0
被浏览
231
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以使用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实现中也不可用。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看