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

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

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

    我该怎么做?在

  • 答案:
  • Python中的字符串是不可变的(不能更改)。因此,线路。更换(…)只是创建一个新字符串,而不是更改旧字符串。你需要在代码中加入新的字符

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

    从Python2.6和更新的Python2.x版本*开始,您可以使用str.translate,(但请继续阅读Python3的不同之处):

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

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

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

    括号内的字符构成字符类行中该类中的任何字符都将替换为sub的第二个参数:空字符串

    在python3中,字符串是Unicode。你得换个角度翻译。kevpie在commenton one of the answers,and it's noted in the

    当调用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, ...}

    更简单,比如another answer puts it,就地创建翻译表:

    unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})

    或创建相同的翻译表str.maketrans公司名称:

    unicode_line = unicode_line.translate(str.maketrans('', '', '!@#$'))

    *为了与早期的python兼容,可以创建一个“null”转换表来代替None

    import string
    line = line.translate(string.maketrans('', ''), '!@#$')

    这里string.maketransem>是一个包含<255个字符的表