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

时间:2014-03-05 02:22:40

标签: python string python-2.7 replace

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

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 个答案:

答案 0 :(得分:105)

字符串在Python中是不可变的,这意味着一旦创建了字符串,就无法改变字符串的内容。如果有的话,您需要更改它,将使用更改创建字符串的新实例。

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

  1. 使用str.replace

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

    >>> "it is icy".translate(None, "i")
    't s cy'
    
  3. 使用正则表达式,

    >>> import re
    >>> re.sub(r'i', "", "it is icy")
    't s cy'
    
  4. 使用理解作为过滤器,

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

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

    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有点矫枉过正。所以,他们都被排除在时间比较之外。

答案 1 :(得分:2)

尝试str.replace()

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

答案 2 :(得分:2)

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

由于您的代码只会替换第一个实例,因此我认为这是您想要的。如果要全部替换它们,请不要使用1参数。

由于您无法替换字符串本身中的字符,因此必须将其重新分配给变量。 (基本上,您必须更新引用而不是修改字符串。)

答案 3 :(得分:2)

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"

答案 4 :(得分: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

没有替换或翻译那么快,但确定。

答案 5 :(得分: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 '''