我试图使用Python从字符串中删除特定字符。这是我现在使用的代码。不幸的是,它似乎对字符串没有做任何事情。

for char in line:
    if char in " ?.!/;:":
        line.replace(char,'')

我如何正确地做到这一点?


当前回答

字符串在Python中是不可变的。replace方法在替换后返回一个新字符串。试一试:

for char in line:
    if char in " ?.!/;:":
        line = line.replace(char,'')

这与您的原始代码相同,只是在循环中添加了对line的赋值。

注意,字符串replace()方法会替换字符串中出现的所有字符,因此可以对想要删除的每个字符使用replace(),而不是遍历字符串中的每个字符,这样做会更好。

其他回答

提问者几乎就说到了。像Python中的大多数事情一样,答案比您想象的要简单。

>>> line = "H E?.LL!/;O:: "  
>>> for char in ' ?.!/;:':  
...  line = line.replace(char,'')  
...
>>> print line
HELLO

你不需要做嵌套的if/for循环,但你确实需要单独检查每个字符。

我使用的方法可能没有那么有效,但它非常简单。我可以一次删除不同位置的多个字符,使用切片和格式化。 这里有一个例子:

words = "things"
removed = "%s%s" % (words[:3], words[-1:])

这将导致在“removed”中保留单词“This”。

格式化对于在打印字符串的中途打印变量非常有用。它可以插入任何数据类型,使用%后跟变量的数据类型;所有数据类型都可以使用%s,浮点数(即小数)和整数可以使用%d。

Slicing can be used for intricate control over strings. When I put words[:3], it allows me to select all the characters in the string from the beginning (the colon is before the number, this will mean 'from the beginning to') to the 4th character (it includes the 4th character). The reason 3 equals till the 4th position is because Python starts at 0. Then, when I put word[-1:], it means the 2nd last character to the end (the colon is behind the number). Putting -1 will make Python count from the last character, rather than the first. Again, Python will start at 0. So, word[-1:] basically means 'from the second last character to the end of the string.

因此,通过切断我想要删除的字符之前的字符和之后的字符,并将它们夹在一起,我可以删除不需要的字符。把它想象成香肠。中间是脏的,所以我想把它处理掉。我只是把我想要的两端剪掉,然后把它们放在一起,中间没有多余的部分。

如果我想删除多个连续字符,我只需在[](切片部分)中移动数字。或者,如果我想从不同的位置删除多个字符,我可以简单地一次将多个切片夹在一起。

例子:

 words = "control"
 removed = "%s%s" % (words[:2], words[-2:])

remove = 'cool'。

words = "impacts"
removed = "%s%s%s" % (words[1], words[3:5], words[-1])

remove = 'macs'。

在本例中,[3:5]表示位置3到位置5的字符(不包括最后位置的字符)。

记住,Python从0开始计数,所以你也需要这样做。

试试这个:

def rm_char(original_str, need2rm):
    ''' Remove charecters in "need2rm" from "original_str" '''
    return original_str.translate(str.maketrans('','',need2rm))

这个方法在python3中很有效

>>> line = "abc#@!?efg12;:?"
>>> ''.join( c for c in line if  c not in '?:!/;' )
'abc#@efg12'

使用过滤器,你只需要一行

line = filter(lambda char: char not in " ?.!/;:", line)

这将字符串视为可迭代对象,如果lambda返回True,则检查每个字符:

> > >帮助(过滤器) 模块__builtin__中内置函数过滤器的帮助: 过滤器(…) filter(function或None, sequence) ->列表、元组或字符串 返回函数(item)为true的序列项。如果 函数为None,返回为true的项。If sequence是一个元组 或者字符串,返回相同的类型,否则返回一个列表。