小编典典

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

all

我正在尝试使用 Python 从字符串中删除特定字符。这是我现在正在使用的代码。不幸的是,它似乎对字符串没有任何作用。

for char in line:
    if char in " ?.!/;:":
        line.replace(char,'')

我该如何正确地做到这一点?


阅读 174

收藏
2022-03-04

共1个答案

小编典典

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
在对其中一个答案的评论中提到str.translate这一点,并在.

调用translateUnicode
字符串的方法时,不能传递我们上面使用的第二个参数。您也不能None作为第一个参数传递。相反,您将翻译表(通常是字典)作为唯一参数传递。该表将字符的
序数值
(即调用ord它们的结果)映射到应该替换它们的字符的序数值,或者“对我们而言”
None,以表明它们应该被删除。

因此,要使用 Unicode 字符串进行上述舞蹈,您可以调用类似

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

这里dict.fromkeysandmap用于简洁地生成包含

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

2022-03-04