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