我有一个包含占位符的长字符串,应该用一些数据替换。
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"
列表中的值数和占位符数总是相同的,我只是事先不知道会有多少。
答案 0 :(得分:6)
my_csv = '%(first)s,%(last)s'
print my_csv % dict(last='Doe', first='John') # John,Doe
我喜欢这个,原因如下:
答案 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
),则以下方法有效。对于strOut
和myList
,如图所示,它生成的字符串为'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