使用字符串切片替换字符串中所有出现的子字符串

Replace all occurrences of the substring in string using string slicing

我想替换字符串中出现的所有子字符串,但我不想使用替换方法。目前,实验让我想到了这一点:

def count_substrings_and_replace(string, substring, rpl=None):
    string_size = len(string)
    substring_size = len(substring)
    count = 0
    _o = string
    for i in range(0, string_size - substring_size + 1):
        if string[i:i + substring_size] == substring:
            if rpl:
                print(_o[:i] + rpl + _o[i + substring_size:])
            count += 1
    return count, _o

count_substrings_and_replace("aaabaaa", "aaa", "ddd")

但我的输出是这样的:

dddbaaa
aaabddd

不是dddbddd

更新 1:

我发现我只能用相同长度的子字符串替换正确。例如对于 count_substrings_and_replace("aaabaaa", "aaa", "d") 我得到的输出是:(2, 'dbaad') 而不是 dbd

更新二:

更新 1 中描述的问题确实出现了,因为字符串与原始字符串 (line 8) 的比较在整个过程中没有改变。

固定:

def count_substrings_and_replace(string, substring, rpl=None):
    string_size = len(string)
    substring_size = len(substring)
    count = 0
    _o = string
    for i in range(0, string_size - substring_size + 1):
        if _o[i:i + substring_size] == substring:
            if rpl:
                _o = _o[:i] + rpl + _o[i + substring_size:]
            count += 1
    return count, _o

count_substrings_and_replace("aaabaaa", "aaa", "d")

输出:(2, dbd)

只是我的错误。我必须在每次迭代时将值传递给变量而不是打印:

_o = _o[:i] + rpl + _o[i + substring_size:]

当找到匹配项时,您永远不会更新 _o 的值,您只是打印出它在被替换时的样子。相反,最里面的 if 语句应该是两行:

_o = _o[:i] + rpl + _o[i + substring_size:]
print(_o)

每次找到并替换匹配项时都会打印字符串,在 for 循环之后将打印语句移动到 运行 将使它仅 运行 一旦整个字符串被解析和替换适当地。