Python替换函数输出不同的结果

问题描述 投票:3回答:4
s="|0000011111111|"
print s.replace(s[9:12],'   ')

...输出是|00000 11|

s="|0000012345678|"
print s.replace(s[9:12],'   ')

...输出是|00000123 78|

我只想将s[9:12]替换为三个空格,为什么第一个输出不正确?

python string python-2.7 replace
4个回答
6
投票

str.replace()将替换您传入的所有字符串作为第一个参数。这里的第一个参数是从切片创建的并不重要,str.replace()方法没有给出关于该字符串来自何处的任何信息。相反,str.replace()方法从位置0开始并向前搜索,在输入字符串中找到子字符串的位置无关紧要。

所以你真的只是这样做:

string_to_replace = s[9:12]
s.replace(string_to_replace, '   ')

甚至只是

s.replace('111', '   ')

这些都具有完全相同的效果。

你的第二个例子只有用,因为s[9:12]字符串值在s中是唯一的;在恰当的位置只需要替换一次。

因为s[9:12]是字符串'111',所以你要求Python用空格替换s中该字符串的所有出现,并且有两个这样的序列要替换。

你明确切片输入字符串要好得多:

s = s[:9] + '   ' + s[12:]

这将获取要替换的部分之前的所有文本以及之后的所有文本,并在这两个子字符串之间放置三个空格。


6
投票

在第一种情况下,s[9:12]'111'。您的代码用三个空格替换'111'的每个非重叠实例。


3
投票

如果你调用s.replace(s[9:12], ' '),那么Python不会将其解释为“将索引9处的字符替换为带有空字符的索引12”。它首先评估s[9:12]'111'。然后它将开始用空格替换三个组,无论在哪里找到它们。

如果要替换特定索引处的字符,可以使用:

print s[:9] + '   ' + s[12:]

这里我们取字符串直到(没有)索引9,然后是三个空格,接着是从索引12开始的字符。

请注意,如果原始字符串不包含12个或更多字符,我们仍会为其添加三个空格。


2
投票

根据Python documentation

str.replace(old, new[, count])

返回字符串的副本,其中所有出现的substring old都替换为new。如果给出可选参数计数,则仅替换第一次计数。

因此replace()不会替换某个位置,它会替换所有出现的字符串中的子字符串。

  • 在你的第一个例子中,s[9:12]等于111,所以这个子串的所有出现都被替换了。
  • 在你的第二个“工作”例子中,你很幸运,因为s[9:12]等于456,因为在ss[9:12]中只有一次出现这个子串,所以它被正确替换。
© www.soinside.com 2019 - 2024. All rights reserved.