在Python中从字符串中删除特定字符
在Python中从字符串中删除特定字符
我正在尝试使用Python从字符串中删除特定的字符。这是我现在使用的代码。不幸的是,它似乎对字符串没有任何影响。
for char in line: if char in " ?.!/;:": line.replace(char,'')
如何正确地做到这一点?
Python中的字符串是不可变的(无法更改)。因此,line.replace(...)
的效果只是创建一个新的字符串,而不是更改旧的字符串。您需要重新绑定(赋值)到line
,以便该变量获取新值,并删除这些字符。
另外,你所做的方式可能会相对较慢。对于有经验的Python开发人员来说,这可能会有点令人困惑,因为他们会看到一个双重嵌套的结构,并认为正在发生更复杂的事情。
在Python 2.6及更新的Python 2.x版本中 *,您可以使用str.translate
。
line = line.translate(None, '!@#$')
或正则表达式替换使用re.sub
import re line = re.sub('[!@#$]', '', line)
方括号中的字符构成字符类。 line
中在该类中的任何字符都将被替换为sub
的第二个参数:空字符串。
Python 3答案
在Python 3中,字符串是Unicode。您需要做一些不同的转换。 Kevpie在其中一个答案的评论中提到了这一点,并在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, ...}
甚至更简单的是,如另一个答案所述,可以在原地创建翻译表:
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的序数值的字符串。