用破折号替换任何非A-Z、非数字的最佳Python方式

用破折号替换任何非A-Z、非数字的最佳Python方式,python,regex,replace,Python,Regex,Replace,我有以下字符串: my_str = "1,123_$ABC_NN&_XX,154440480,YVH?ADXX,,503,TCCTGA,503,TATCCTCT,,,154440480" 我想保留所有的A-Z、0-9、破折号和下划线,并用破折号替换所有其他内容。做这件事最好的方法是什么 我已经这样做了,它可以工作,但很混乱: my_str.replace('#','-').replace('!','-').replace('"','-').replace('$','-').replac

我有以下字符串:

my_str = "1,123_$ABC_NN&_XX,154440480,YVH?ADXX,,503,TCCTGA,503,TATCCTCT,,,154440480"
我想保留所有的A-Z、0-9、破折号和下划线,并用破折号替换所有其他内容。做这件事最好的方法是什么

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

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(' ','-')
[代码>我的工程项目.我的工程项目.我的工程项目.工程项目..我的工程项目.我的工程项目.我的工程项目.我的工程项目.我的工程项目.我的工程项目.我的工程项目..我的工程项目.更换((((((353535;;.......................................................................更换...更换........................................................................................“{','-')。替换('}','-')。替换('?','-')。替换(“/”、“-”).replace(“>”、“-”).replace(“您可以使用:

>>> 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\]
和连字符。

或者您可以通过以下方式进行匹配:

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

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

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中测试