天天看点

python从字符串中删除字符_从Python中的字符串中删除特定字符

Python中的字符串是不可变的(不能更改).因此,line.replace(…)的效果只是创建一个新字符串,而不是更改旧字符串.您需要将其重新绑定(分配)为行,以使该变量获取新值,并删除这些字符.

而且,你这样做的方式相对来说会变慢.对于经验丰富的pythonator来说,这也可能有点令人困惑,他们会看到一个双重嵌套的结构,并想一想更复杂的事情正在发生.

从Python 2.6和更新的Python 2.x版本*开始,您可以使用str.translate,(但请继续阅读Python 3的差异):

line = line.translate(None, '!@#$')

或用re.sub替换正则表达式

import re

line = re.sub('[!@#$]', '', line)

括号中的字符构成一个字符类.该类中的所有行中的字符都被替换为sub的第二个参数:空字符串.

在Python 3中,字符串是Unicode.你将不得不翻译一点点. kevpie在comment中提到了其中一个答案,并在documentation for str.translate中注明了这一点.

调用Unicode字符串的translate方法时,无法传递上面使用的第二个参数.您也不能将None作为第一个参数传递,甚至不能传递string.maketrans中的转换表.相反,您将字典作为唯一参数传递.这个字典将字符的序数值(即调用它们的ord的结果)映射到应该替换它们的字符的序数值,或者对我们有用 – 无表示它们应该被删除.

所以要用Unicode字符串做上面的舞蹈,你会称之为

translation_table = dict.fromkeys(map(ord, '!@#$'), None)

unicode_line = unicode_line.translate(translation_table)

{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的字符的字符串.