【问题标题】:Easy way to replace placeholders in string with the list of values?用值列表替换字符串中的占位符的简单方法?
【发布时间】:2012-12-02 00:01:27
【问题描述】:

我有一个包含占位符的长字符串,应该用一些数据替换。

strOut = "text text {{ }} text text {{ }}"

这种模式

pattern = r'\{{(.+?)\}}'

我很容易做这样的事情

pattern.sub(self.mymethod, strOut)

将调用 mymethod 进行替换。它实际上工作得很好。 然而,这就是现在的问题。我需要用列表中的值替换字符串中的所有占位符。例如,这又是字符串:

strOut = "text text {{ }} text {{ }} text"

它总是有不确定数量的占位符。如果我还有一个列表,比如说 2 个值

myList = [2, 3]

我需要一种将这些值注入占位符的方法,并最终得到这个

"text text 2 text 3 text"

一个列表中的值的个数和占位符的个数总是一样的,只是不知道会有多少个。

【问题讨论】:

    标签: python


    【解决方案1】:
    my_csv = '%(first)s,%(last)s'
    print my_csv % dict(last='Doe', first='John')  # John,Doe
    

    我喜欢这个有以下原因:

    • 不再需要对值进行排序
    • 可以一次性替换多个占位符。

    灵感来自https://stackoverflow.com/a/11023271/2147228

    【讨论】:

      【解决方案2】:

      示例代码:

      >>> strOut = "text text {{ }} text text {{ }}"
      >>> pattern = r'\{{(.+?)\}}'
      >>> import re
      >>> re.findall(pattern, strOut)
      [' ', ' ']
      >>> items = iter(str(el) for el in [1, 2])
      # as pointed out by @eyquem, this can also be written as:
      # items = imap(str, [1, 2])
      
      >>> re.sub(pattern, lambda L: next(items), strOut)
      'text text 1 text text 2'
      

      如果没有足够的参数来满足占位符,这将中断,否则忽略其余部分。

      如果你使用的是 2.7+,如果你可以使用 {} 作为占位符,你会笑的,因为你可以使用 'text text {} text text {}'.format(*[1,2]) 例如

      为了“好玩”

      (ab)使用 lambda,您可以:

      re.sub(pattern, lambda i, j=(str(el) for el in [1, 2]): next(j), strOut)
      

      【讨论】:

      • @Zed 出于好奇 - 有什么理由不能使用内置的 str.format 并使用 {} 作为占位符?
      • @Jon Clements 不是iter(str(el) for el in [1, 2]) fommowing:imap(str,[1, 2]) 吗?
      • @eyquem d0h!是的,我只是有 iter([1, 2]) 然后意识到它不起作用,所以把它改成生成器
      【解决方案3】:

      如果在您的strOut 文本中没有出现'{}'(而不是'{{ }}'),则以下方法有效。对于如图所示的strOutmyList,它产生的字符串是'text text 2 text 3 text'

      strOut = "text text {{ }} text {{ }} text"
      myList = [2, 3]
      strOut.replace('{{ }}','{}').format(*myList)
      

      【讨论】:

        【解决方案4】:

        您可以使用format function 并通过参数解包 (*) 传递列表

        >>> myList = [2, 3]
        >>> strOut = 'text text {} text {} text'
        >>> print(strOut.format(*myList))
        text text 2 text 3 text
        

        【讨论】:

          【解决方案5】:

          你可以试试这样的(它使用re.subcount参数):

          In [1]: import re
          
          In [2]: strOut = "text text {{ }} text text {{ }}"
          
          In [3]: pattern = r'\{{(.+?)\}}'
          
          In [4]: reduce(lambda x, y: re.sub(pattern, str(y), x, 1), [2, 3], strOut)
          Out[4]: 'text text 2 text text 3'
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-11
            • 1970-01-01
            • 2021-12-05
            • 2011-01-24
            • 2018-12-15
            • 1970-01-01
            相关资源
            最近更新 更多