Python 中的字符串是不可变的(无法更改)。正因为如此,line.replace(...) 的作用只是创建一个新字符串,而不是更改旧字符串。您需要将其重新绑定(分配)给line,以便让该变量采用新值,并删除这些字符。
此外,相对而言,您执行此操作的方式会有点慢。对于经验丰富的 Python 开发者来说,这也可能会有点令人困惑,他们会看到一个双重嵌套的结构,并会认为正在发生更复杂的事情。
从 Python 2.6 和更新的 Python 2.x 版本 * 开始,您可以改用 str.translate,(请参阅下面的 Python 3 答案):
line = line.translate(None, '!@#$')
或用re.sub替换正则表达式
import re
line = re.sub('[!@#$]', '', line)
括号中的字符构成一个字符类。 line 中属于该类的任何字符都将替换为 sub 的第二个参数:一个空字符串。
Python 3 答案
在 Python 3 中,字符串是 Unicode。你必须翻译得有点不同。 kevpie 在其中一个答案的comment 中提到了这一点,并在documentation for str.translate 中注明。
当调用 Unicode 字符串的translate 方法时,不能传递我们上面使用的第二个参数。您也不能将None 作为第一个参数传递。相反,您将翻译表(通常是字典)作为唯一参数传递。此表将字符的序数值(即在它们上调用ord 的结果)映射到应该替换它们的字符的序数值,或者——对我们有用——None 来表示他们应该被删除。
因此,要使用 Unicode 字符串进行上述舞蹈,您可以调用类似
translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)
这里dict.fromkeys和map用于简洁地生成包含
的字典
{ord('!'): None, ord('@'): None, ...}
更简单,如another answer puts it,就地创建转换表:
unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})
或者,正如Joseph Lee 所提出的,创建与str.maketrans 相同的转换表:
unicode_line = unicode_line.translate(str.maketrans('', '', '!@#$'))
* 为了与早期的 Python 兼容,您可以创建一个“空”转换表来代替 None:
import string
line = line.translate(string.maketrans('', ''), '!@#$')
这里string.maketrans是用来创建一个翻译表的,它只是一个包含序数值0到255的字符的字符串。