【问题标题】:Best Pythonic way to replace any non-A-Z, non numbers, with a dash用破折号替换任何非 A-Z、非数字的最佳 Pythonic 方法
【发布时间】:2016-03-22 16:58:21
【问题描述】:

我有以下字符串:

my_str = "1,123_$ABC_NN&_XX,154440480,YVH?ADXX,,503,TCCTGA,503,TATCCTCT,,,154440480"

我想保留所有的 A-Z、0-9、破折号和下划线,并用破折号替换其他所有内容。最好的 Pythonic 方法是什么?

我已经这样做了,它可以工作,但它很乱:

my_str.replace('#','-').replace('!','-').replace('"','-').replace('$','-').replace('%','-').replace('^','-').replace('&','-').replace('*','-').replace('(','-').replace(')','-').replace('@','-').replace('~','-').replace(';','-').replace(':','-').replace('[','-').replace(']','-').replace('{','-').replace('}','-').replace('?','-').replace('/','-').replace('>','-').replace('<','-').replace('|','-').replace('\\','-').replace(' ','-')

【问题讨论】:

    标签: python regex replace


    【解决方案1】:

    你可以使用:

    >>> my_str = "1,123_$ABC_NN&_XX,154440480,YVH?ADXX,,503,TCCTGA,503,TATCCTCT,,,154440480"
    >>> re.sub(r'[^\w-]', '-', my_str)
    '1-123_-ABC_NN-_XX-154440480-YVH-ADXX--503-TCCTGA-503-TATCCTCT---154440480'
    

    如果你想避免使用多个连字符,那么:

    >>> re.sub(r'[^\w-]+', '-', my_str)
    '1-123_-ABC_NN-_XX-154440480-YVH-ADXX-503-TCCTGA-503-TATCCTCT-154440480'
    

    [^\w-] 匹配任何不是单词 char 的字符(包括 [a-zA-Z0-9_] 和连字符。

    【讨论】:

      【解决方案2】:

      或者你可以这样做:

      >>> import re
      >>> re.sub('[^A-Z0-9-_]', '-', my_str)
      '1-123_-ABC_NN-_XX-154440480-YVH-ADXX--503-TCCTGA-503-TATCCTCT---154440480'
      

      【讨论】:

        【解决方案3】:

        如果您经常这样做,您可以预先构建一个翻译表,然后将其应用于每个字符串。如果正在处理大量字符串,这将非常快:

        my_trans_list = ['-'] * 256
        
        for x in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-':
            my_trans_list[ord(x)] = x
        
        my_trans = ''.join(my_trans_list)
        
        my_str = "1,123_$ABC_NN&_XX,154440480,YVH?ADXX,,503,TCCTGA,503,TATCCTCT,,,154440480"
        print my_str.translate(my_trans)
        

        这将显示:

        1-123_-ABC_NN-_XX-154440480-YVH-ADXX--503-TCCTGA-503-TATCCTCT---154440480
        

        在 Python 2.7.6 中测试

        【讨论】:

          猜你喜欢
          • 2018-04-22
          • 1970-01-01
          • 2011-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-28
          • 2011-03-08
          • 2014-10-05
          相关资源
          最近更新 更多