【问题标题】:Strip Specific Punctuation in Python 2.x在 Python 2.x 中去除特定标点符号
【发布时间】:2012-02-10 02:07:01
【问题描述】:

我正在使用 Python v2.6,并且我有一个字符串,其中包含许多我想去掉的标点符号。现在我已经研究过使用string.punctuation() 函数,但不幸的是,我想去掉除句号和破折号之外的所有标点符号。总共只有 5 个标点符号我想去掉 - ()\"'

有什么建议吗?我希望这是最有效的方法。

谢谢

【问题讨论】:

标签: python string strip


【解决方案1】:

您可以使用str.translate(table[, deletechars]) 并将table 设置为None,这将导致deletechars 中的所有字符都从字符串中删除:

s.translate(None, r"()\"'")

一些例子:

>>> "\"hello\" '(world)'".translate(None, r"()\"'")
'hello world'
>>> "a'b c\"d e(f g)h i\\j".translate(None, r"()\"'")
'ab cd ef gh ij'

【讨论】:

    【解决方案2】:

    你可以列出所有你不想要的字符:

    unwanted = ['(', ')', '\\', '"', '\'']
    

    然后你可以像这样创建一个函数strip_punctuation(s)

    def strip_punctuation(s): 
        for u in unwanted: 
            s = s.replace(u, '')
        return s
    

    【讨论】:

      【解决方案3】:
      >>> import re
      >>> r = re.compile("[\(\)\\\\'\"]")
      >>> r.sub("", "\"hello\" '(world)'\\\\\\")
      'hello world'
      

      【讨论】:

      • 这不会从原始字符串中删除反斜杠。 r.sub('', 'a\\b') --> 'a\\b'
      • 对,这个有很多答案,但我认为编译的正则表达式将是最有效的解决方案。永远记住,“给一个人一个正则表达式,他会匹配一个字符串......但是通过教他如何创建它们,你已经给了他足够的绳索来吊死自己”
      • @Paulo:我不喜欢原始字符串,它们让我想起了 Windows 中的路径;)
      • @Paulo:我发现这取决于您需要多少反斜杠。 r"C:\Program Files\SomeCompany\SomeProgram Version 7\Internals\foobar.bla" 显然比替代方案好得多,但很多时候我也需要 "\t\n\0\xad\xde\xef\xbe"...
      【解决方案4】:

      使用string.translate

      s = ''' abc(de)f\gh"i' '''
      print(s.translate(None, r"()\"'"))
       # abcdefghi 
      

      re.sub:

      import re
      re.sub(r"[\\()'\"]",'',s)
      

      string.translate 似乎要快一个数量级:

      In [148]: %timeit (s*1000).translate(None, r"()\"'")
      10000 loops, best of 3: 112 us per loop
      
      In [146]: %timeit re.sub(r"[\\()'\"]",'',s*1000)
      100 loops, best of 3: 2.11 ms per loop
      

      【讨论】:

      • 无需制作空白翻译表;只需使用None
      • 另外,您的代码格式已损坏。看起来是无与伦比的"
      • 乔希,感谢您对 translate(None,...) 的更正。哪里格式不对?我已经运行了代码。它似乎有效。
      • 好吧,print 显示为红色。看起来 SO 没有正确解析三引号。也许你需要提示一下代码 sn-p 是 Python?我不知道。
      【解决方案5】:

      您可以创建一个包含所有要替换的字符的字典,并用您选择的字符替换它们。

      char_replace = {"'":"" , "(":"" , ")":"" , "\":"" , """:""}
      
      for i,j in char_replace.iteritems():
              string = string.replace(i,j)
      

      【讨论】:

        【解决方案6】:
        my_string = r'''\(""Hello ''W\orld)'''
        strip_chars = r'''()\'"'''
        

        使用理解:

        ''.join(x for x in my_string if x not in strip_chars)
        

        使用过滤器:

        ''.join(filter(lambda x: x not in strip_chars, my_string))
        

        输出:

        Hello World
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-20
          • 1970-01-01
          • 2011-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多