【问题标题】:Replace all occurrences of the substring using slicing when size of replacement string the differs from substring当替换字符串的大小与子字符串不同时,使用切片替换所有出现的子字符串
【发布时间】:2021-03-17 21:47:59
【问题描述】:

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

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

我发现它不适用于rpl 的任何大小。

例如count_substrings_and_replace("aaaQaaa", "aaa", "dddddd")我有输出:

(2, 'ddddddQdddddd'),好的

但如果rpl 采用更大的尺寸,例如:count_substrings_and_replace("aaaQaaaQaaa", "aaa", "ddddddddd") 我有输出:

(2, 'dddddddddQdddddddddQaaa').

我该如何解决这个问题?

【问题讨论】:

  • 在您的第一个输入示例中,我的输出是(2, 'ddddddQdddddd'),代码相同
  • @etch_45 哦。是的,我的错。我现在就修复它
  • @etch_45 也许for i in range(0, string_size * int(rpl_size/2)): 会是好的解决方案?

标签: python string replace substring


【解决方案1】:

您正在覆盖相同的string 变量,从而改变它的大小。在您的示例中,每次将 aaa 替换为 ``dddddddd, your string is longer, and range(0, string_size + rpl_size)` 都是过时的。

def count_substrings_and_replace(string, substring, rpl=None):
    string_size = len(string)
    substring_size = len(substring)
    rpl_size = len(rpl)

    count = 0
    i = 0
    while i < string_size:
        if string[i:i + substring_size] == substring:
            if rpl:
                string = string[:i] + rpl + string[i + substring_size:]
                string_size += rpl_size - substring_size
                # this is important to avoid replacement of substrings
                # contained in rpl, e.g. `aaa` and `aaaaaaaa`
                i += rpl_size
            count += 1
        else:
            i += 1
    return count, string

但是,如果您只是将结果存储在一个新变量中而忘记切片部分会容易得多。

def count_substrings_and_replace(string, substring, rpl=None):
    count = 0
    i = 0
    result = ''
    
    while i < len(string):
        if string[i:i + len(substring)] == substring:
            result += rpl
            count += 1
            i += len(substring)
        else: 
            result += string[i]
            i += 1
    return count, result

【讨论】:

    猜你喜欢
    • 2014-05-18
    • 2014-06-09
    • 1970-01-01
    • 2013-07-10
    • 2017-03-23
    • 1970-01-01
    • 2017-03-16
    • 2018-03-26
    • 1970-01-01
    相关资源
    最近更新 更多