0

我有以下元组:

out = [1021,1022 ....]  # a tuple

我需要遍历一些记录,用列表条目替换“Keys1029”中的每个数字。这样就不必:

....Settings="Keys1029"/>
....Settings="Keys1029"/>

我们有:

....Settings="Keys1020"/>
....Settings="Keys1022"/>

我有以下内容:

for item in out:
    text = text.replace("Keys1029","Keys"+(str(item),1))

这给出了 TypeError: cannot concatenate 'str' 和 'tuple' 对象。

有人可以建议我如何解决这个问题吗?

提前致谢

4

6 回答 6

4

您有一些不必要的括号,请尝试以下操作:

for item in out:
    text = text.replace("Keys1029", "Keys"+str(item), 1)
于 2013-05-15T16:54:03.610 回答
1
"Keys"+(str(item),1)

"Keys"是一个字符串并且(str(item), 1)是一个元组。你不能连接它们。尝试做。

"Keys"+str(item)
于 2013-05-15T16:53:23.493 回答
1

尝试这个:

for item in out:
    text = text.replace("Keys1029","Keys"+str(item))

我删除了 str 周围的 (),因为 (..., 1) 使它成为一个元组。

于 2013-05-15T16:54:56.840 回答
1

首先,[1021,1022 ....]是一个列表,而不是一个元组。(1021,1022 ....)将是一个元组。

item是一个数字,str(item)是一个包含这个数字的字符串。用于"Keys"+str(item)连接两个字符串。无需创建元组。

您也可以使用格式化方法:"Keys%d" % item.

于 2013-05-15T16:56:09.850 回答
0

text.replace("Keys1029","Keys%s"%item)

应该可以正常工作

于 2013-05-15T16:54:22.513 回答
0

您可以使用re.sub替换功能来执行此操作。因此,对于每个匹配模式,您从out列表中获取下一个项目,并将其用作替换。请注意,如果没有足够out的 s,您将抛出异常,但反之则不会。

这种方法的一个优点是它可以一次性完成所有替换 - 因此您不需要str.replaceout.

此外,如果您愿意并且它是合适的,您可以按原样放弃out并使用诸如out = itertools.count(1021)和之类的东西,这会给您一个从 1021 开始的递增整数的迭代。

基于 OP 的示例

out = [1021, 1022]

text=  """
....Settings="Keys1029"/>
....Settings="Keys1029"/>"""

import re
print re.sub('(Settings="Keys)(.*?)(")', lambda m, n=iter(out): m.group(1) + str(next(n)) + m.group(3), text)

然后你最终得到:

....Settings="Keys1021"/>
....Settings="Keys1022"/>
于 2013-05-15T17:05:32.307 回答