【问题标题】:.replace only replaces last character in list.replace 仅替换列表中的最后一个字符
【发布时间】:2020-10-16 17:21:09
【问题描述】:
title = 'Example#@@@+||'

blacklisted_chars = ['#','|','@','+']

for i in blacklisted_chars:
    convert = title.replace(i, '')
    
print(convert)

# Example#@@@||

我想删除列表中所有列入黑名单的字符并将它们替换为 '',但是当代码运行时,仅在 print 语句中替换最终的 'blacklisted_char'

我想知道如何替换所有字符并且只打印“示例”

【问题讨论】:

标签: python string replace


【解决方案1】:

字符串在 python 中是不可变的。你用

分配一个 new 字符串
convert = title.replace(i, '')

title 在此声明之后保持不变。 convert 是一个全新的字符串,缺少 i

在下一次迭代中,您替换了 i 的不同值,但仍与原来的 title 不同。所以最后看起来你只是跑了

convert = title.replace('+', '')

您有两个非常相似的选项,具体取决于您是否要保留原来的title

如果这样做,请再次引用它,并使用结果不断更新该引用,以便每次后续迭代都建立在先前删除的结果之上:

convert = title
for i in blacklisted_chars:
    convert = convert.replace(i, '')
    
print(convert)

如果您不想保留原来的title,请直接使用该名称:

for i in blacklisted_chars:
    title = title.replace(i, '')
    
print(title)

您可以使用re.sub 获得类似的结果,而无需显式循环:

convert = re.sub('[#|@+]', '', title)

【讨论】:

    【解决方案2】:

    试试这个:

    title = 'Example#@@@+||'
    
    blacklisted_chars = ['#','|','@','+']
    
    for i in blacklisted_chars:
        title = title.replace(i, '')
        
    print(title)
    

    解释:由于您将title.replace 的结果存储在convert 变量中,因此每次迭代都会覆盖它。您需要将replace 应用于上一次迭代的结果,如果您想保持原始值不变,则可以是带有原始字符串的变量或包含它的副本的另一个变量。

    P.S.:字符串是可迭代的,因此您也可以通过以下方式获得相同的结果:

    blacklisted_chars = '#|@+'
    

    【讨论】:

    • 不错的更新。当你解释正在发生的事情时会好得多。
    猜你喜欢
    • 2011-02-03
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多