2012-12-14 38 views
2

我有一個包含佔位符的長字符串,應該用一些數據替換。簡單的方法用值列表替換字符串中的佔位符?

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" 

數落得佔位符將永遠是一樣的,我只是不知道會有多少。

回答

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),你可以這樣做:

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

就是這樣,工程巨大,謝謝! – Zed

+1

@出於好奇 - 你無法使用內建的'str.format'並使用'{}'作爲佔位符? –

+0

@Jon Clements不是''iter(str(el)for el [1,2])'''emomowing:''imap(str,[1,2])''? – eyquem

0

你可以嘗試這樣的事情(它使用的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' 
1

如果沒有的'{}'露面(相對於'{{ }}')在strOut文字,下面的方法工作。如圖所示,strOutmyList,它產生的字符串是'text text 2 text 3 text'

strOut = "text text {{ }} text {{ }} text" 
myList = [2, 3] 
strOut.replace('{{ }}','{}').format(*myList) 
4
my_csv = '%(first)s,%(last)s' 
print my_csv % dict(last='Doe', first='John') # John,Doe 

我喜歡這個,原因如下:

  • 不再需要值的排序
  • 多個佔位符,可以一次性更換。

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

1

啓發您可以使用format function,並通過列表與參數拆包(*)

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