用字符串替换字符串中的占位符的简单方法?

时间:2012-12-14 00:36:45

标签: python

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

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

使用此模式

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

我很容易做这样的事情

pattern.sub(self.mymethod, strOut)

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

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

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

myList = [2, 3]

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

"text text 2 text 3 text"

列表中的值数和占位符数总是相同的,我只是事先不知道会有多少。

5 个答案:

答案 0 :(得分:6)

my_csv = '%(first)s,%(last)s'
print my_csv % dict(last='Doe', first='John')  # John,Doe

我喜欢这个,原因如下:

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

受到https://stackoverflow.com/a/11023271/2147228

的启发

答案 1 :(得分:3)

示例代码:

>>> 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)

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

您可以使用format function并使用参数解包(*)

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

答案 4 :(得分:0)

你可以尝试这样的事情(它使用count的{​​{1}}参数):

re.sub