【问题标题】:Is it possible to write nested format strings?是否可以编写嵌套格式字符串?
【发布时间】:2020-11-16 13:01:31
【问题描述】:

我想写一些类似的东西

format_specifier = "{some_dict[some_key]}"

以后和.format()一起使用:

result = format_specifier.format(some_dict={"one": "eins", "two": "zwei"}, some_key="one")

我想评估为"eins",但我得到的是KeyError

KeyError: 'some_key'

我还尝试了额外的大括号:"{some_dict[{some_key}]}" 导致 KeyError: '{some_key}'..

首先可以嵌套这样的格式字符串吗?

注意:我必须稍后评估字符串,所以我猜 f 字符串格式不适合我..

【问题讨论】:

    标签: python python-3.x string formatting string-formatting


    【解决方案1】:

    如果您使用eval 并将您使用的格式参数定义为局部变量的集合,您可以评估格式字符串。

    format_specifier = "some_dict[another_dict[some_key]]"
    
    def formatComplex(str, **kwargs):
      # check str for correct format: only regex [a-zA-Z0-9\[\]] allowed
      return eval(str, None, kwargs)
    
    result = formatComplex(format_specifier, some_dict={3:"Hello"}, another_dict={"bla":3}, some_key="bla")
    
    print (result)
    

    您可以通过编写自己的 string.Formatter 子类并将其添加到字符串格式中,并实现一个新的 parse() 方法,将这些复杂格式替换为文字文本

    【讨论】:

      【解决方案2】:

      受到rioV8的启发,我现在这样做了,但我认为如果没有Python内置的方法可以做到这一点,它可以非常简化:

      def formatComplex(specifier: str, format_data):
          result = specifier
          while True:
              matches = re.findall(".*{([A-Za-z0-9_\-\/\ \,\.\'\"\(\)\[\]]+)}.*", result)
              if not matches:
                  break
              for m in matches:
                  result = result.replace("{%s}" % m, str(eval(m, None, format_data)))
                  
          return result
      
      >>> format_specifier = "{some_dict[another_dict[some_key]]} world"
      >>> formatComplex(format_specifier, {
      ...    "some_dict": {3: "Hello"}, 
      ...    "another_dict": "three": 3}, 
      ...    "some_key":"three"})
      Hello world
      
      >>> formatComplex("Hello {who} {what} bar", {"who": "world", "what": "foo"})
      Hello world foo bar
      

      【讨论】:

        猜你喜欢
        • 2018-11-18
        • 2016-04-21
        • 1970-01-01
        • 2013-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多