【问题标题】:Python replace function outputs different resultsPython替换函数输出不同的结果
【发布时间】:2018-06-24 13:36:10
【问题描述】:
s="|0000011111111|"
print s.replace(s[9:12],'   ')

...输出为|00000 11|

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

...输出为|00000123 78|

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

【问题讨论】:

  • 因为 replace 需要一个字符串值。该字符串值的来源不是字符串的一部分。

标签: python string python-2.7 replace


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    str.replace() 将替换您作为第一个参数传入的字符串的 all 次。这里的第一个参数是从切片创建的并不重要,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:]
    

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

        【解决方案4】:

        根据Python documentation

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

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

        所以replace() 不会替换 at 一个位置,它会替换 在您的字符串中找到的所有出现的子字符串 由另一个给定的字符串。

        • 在您的第一个示例中,s[9:12] 等于 111,因此该子字符串的所有匹配项都将被替换。

        • 在您的第二个 "working" 示例中,您很幸运,因为 s[9:12] 等于 456 并且因为在 s 中仅出现一次此子字符串s[9:12],替换正确。

        【讨论】:

          猜你喜欢
          • 2021-04-21
          • 1970-01-01
          • 2013-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多