如何在Python中删除字符串中所有实例的字符?

91

我该如何删除字符串中所有特定字符的实例?这是我的代码:

def findreplace(char, string):
    place = string.index(char)
    string[place] = ''
    return string

然而,如果我运行这个程序,会发生这样的事情:

>>> findreplace('i', 'it is icy')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in findreplace
TypeError: 'str' object does not support item assignment

为什么会这样?

6个回答

174

在Python中,字符串是不可变的,这意味着一旦创建了一个字符串,就不能更改字符串的内容。如果需要更改字符串,需要创建一个新的实例。

考虑到这一点,我们有很多方法来解决这个问题。

  1. Using str.replace,

    >>> "it is icy".replace("i", "")
    't s cy'
    
  2. Using str.translate,

    >>> "it is icy".translate(None, "i")
    't s cy'
    
  3. Using Regular Expression,

    >>> import re
    >>> re.sub(r'i', "", "it is icy")
    't s cy'
    
  4. Using comprehension as a filter,

    >>> "".join([char for char in "it is icy" if char != "i"])
    't s cy'
    
  5. Using filter function

    >>> "".join(filter(lambda char: char != "i", "it is icy"))
    't s cy'
    

时间比较

def findreplace(m_string, char):
    m_string = list(m_string)
    for k in m_string:
        if k == char:
            del(m_string[m_string.index(k)])
    return "".join(m_string)

def replace(m_string, char):
    return m_string.replace("i", "")

def translate(m_string, char):
    return m_string.translate(None, "i")

from timeit import timeit

print timeit("findreplace('it is icy','i')", "from __main__ import findreplace")
print timeit("replace('it is icy','i')", "from __main__ import replace")
print timeit("translate('it is icy','i')", "from __main__ import translate")

结果

1.64474582672
0.29278588295
0.311302900314

str.replacestr.translate方法的速度比已接受的答案快8倍和5倍。

注意:在这种情况下,理解方法和过滤方法预计会更慢,因为它们必须创建列表,然后必须再次遍历以构造字符串。而对于单个字符替换,re有点过头了。因此,所有这些方法都被排除在时间比较之外。


.translate(maketrans('','')) 与 .translate(None) 是一样的吗? - user217285
可以说,对于更复杂的示例,正则表达式可能会表现得更好,这也是很不错的。但是,回答非常棒! - ThatsAMorais
2
比起被接受的答案,它们分别快了8倍和5倍。但是目前还没有被接受的答案。 - whackamadoodle3000

13

尝试使用 str.replace() 方法:

my_string = "it is icy"
print my_string.replace("i", "")

7
不应该将 str 作为一个变量名。 - whackamadoodle3000

3
>>> x = 'it is icy'.replace('i', '', 1)
>>> x
't is icy'

由于您的代码只会替换第一个实例,我假设这就是您想要的。如果您想要替换所有实例,请省略1参数。

由于您无法直接替换字符串中的字符,因此您需要将其重新分配回变量。(实际上,您需要更新引用而不是修改字符串。)


3

replace()方法可以解决这个问题。以下代码可以帮助删除字符串中的字符,比如:

j_word = 'Stringtoremove'
word = 'String'    

for letter in word:
    if j_word.find(letter) == -1:
        continue
    else:
       # remove matched character
       j_word = j_word.replace(letter, '', 1)

#Output
j_word = "toremove"

谢谢。我正在寻找一种方法来完全删除“Stringtoremove”,当有任何子字符串“String”时。你有任何想法吗? - Azam
你的情况下输入是什么,@Azam?如果输入完全不同最好提出单独的问题。 - MaNKuR
假设我有一个列表a=['8000 250V320 FEW015CB', '9000 120V180 SCT014']。我希望删除第二个参数,即中间带有V的参数,并保留其他参数,如a=['8000 FEW015CB', '9000 SCT014']。该参数可能出现在任何位置,可能是元素1、2或3。有什么想法吗?提前致谢。 - Azam

1
我建议拆分(不是说其他答案无效,这只是另一种方法):
def findreplace(char, string):
   return ''.join(string.split(char))

通过一个字符进行拆分会删除所有的字符并将其转换为列表。然后我们使用join函数将列表连接起来。您可以在下面的IPython控制台测试中看到。
In[112]: findreplace('i', 'it is icy')
Out[112]: 't s cy'

而速度...

In[114]: timeit("findreplace('it is icy','i')", "from __main__ import findreplace")
Out[114]: 0.9927914671134204

不如replace或translate快,但还可以接受。

0
# s1 == source string
# char == find this character
# repl == replace with this character
def findreplace(s1, char, repl):
    s1 = s1.replace(char, repl)
    return s1

# find each 'i' in the string and replace with a 'u'
print findreplace('it is icy', 'i', 'u')
# output
''' ut us ucy '''

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接