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"

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

4

5 回答 5

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

我喜欢这个,原因如下:

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

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

于 2016-02-03T18:04:00.803 回答
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)
于 2012-12-14T00:41:17.153 回答
1

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

strOut = "text text {{ }} text {{ }} text"
myList = [2, 3]
strOut.replace('{{ }}','{}').format(*myList)
于 2012-12-14T00:54:27.197 回答
1

您可以使用格式函数并通过参数解包 (*) 传递列表

>>> myList = [2, 3]
>>> strOut = 'text text {} text {} text'
>>> print(strOut.format(*myList))
text text 2 text 3 text
于 2017-12-24T11:07:36.983 回答
0

您可以尝试这样的事情(它使用的count参数re.sub):

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'
于 2012-12-14T00:43:07.307 回答