我试图用Python从一个字符串中删除特定的字符。这是我现在使用的代码。不幸的是,它似乎对字符串没有任何作用。
for char in line:
if char in " ?.!/;:":
line.replace(char,'')
我怎样才能正确地做到这一点?
Python中的字符串是不可变的(不能被改变)。 正因为如此,line.replace(...)
的作用只是创建一个新的字符串,而不是改变旧的字符串。 你需要重新绑定(分配)它到line
,以便让该变量接受新的值,并删除这些字符。
另外,你的方法相对来说会很慢。 对于有经验的Python用户来说,这也可能会让他们感到困惑,他们会看到一个双重嵌套的结构,并认为发生了更复杂的事情。
从Python 2.6和较新的Python 2.x版本*开始,你可以使用str.translate
,(但要继续阅读Python 3的差异)。
line = line.translate(None, '!@#$')
或用 [re.sub
] (https://docs.python.org/2/library/re.html#re.sub) 进行正则表达式替换。
import re
line = re.sub('[!@#$]', '', line)
括号内的字符构成一个字符类。 在 "line "中的任何字符都会被替换成 "sub "的第二个参数:一个空字符串。
在Python 3中,字符串是Unicode。kevpie在一个答案的评论中提到了这一点,而且在str.translate的文档中也提到了这一点。
当调用Unicode字符串的translate
方法时,你不能传递我们上面使用的第二个参数。你也不能传递None
作为第一个参数,甚至不能传递string.maketrans
的翻译表。相反,你要传递一个字典作为唯一的参数。这个字典将字符的*序数值(即对它们调用ord
的结果)映射到应该替换它们的字符的序数值,或者--对我们来说--None
表示它们应该被删除。
因此,要对Unicode字符串进行上述操作,你需要调用以下内容
translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)
这里dict.fromkeys
和map
被用来简洁地生成一个字典,其中包括
{ord('!'): None, ord('@'): None, ...}
更简单的,如另一个答案,在原地创建字典。
unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})
*为了与早期的Pythons兼容,你可以创建一个"null" 翻译表来代替None
。
import string
line = line.translate(string.maketrans('', ''), '!@#$')
这里string.maketrans
被用来创建一个翻译表,它只是一个包含序号为0到255的字符的字符串。