只保留某些字符在使用Python字符串?(Keeping only certain characte

2019-08-18 21:38发布

在我的节目,我有一个这样的字符串:

CT是OSO gcota

使用Python,我的目标是摆脱白色空间,只保留A,T,C和G字。 我知道如何摆脱白色空间(我只是用线= line.replace(””,‘’))。 但是,我怎么能摆脱时,他们可能会在字母表中的任何其他信我并不需要的字符?

Answer 1:

一个非常优雅和快速的方法是使用正则表达式:

import re

str = 'ag ct oso gcota'
str = re.sub('[^atcg]', '', str)

"""str is now 'agctgcta"""


Answer 2:

我可能会做这样的事情:

chars_i_want = set('atcg')
final_string = ''.join(c for c in start_string if c in chars_i_want)

这可能是做最简单的方法。


另一种选择是使用str.translate做的工作:

import string
chars_to_remove = string.printable.translate(None,'acgt')
final_string = start_string.translate(None,chars_to_remove)

我不知道这将有更好的表现。 它会需要进行定时通过timeit确切了解。


更新 :计时!

import re
import string

def test_re(s,regex=re.compile('[^atgc]')):
    return regex.sub(s,'')

def test_join1(s,chars_keep=set('atgc')):
    return ''.join(c for c in s if c in chars_keep)

def test_join2(s,chars_keep=set('atgc')):
    """ list-comp is faster, but less 'idiomatic' """
    return ''.join([c for c in s if c in chars_keep])

def translate(s,chars_to_remove = string.printable.translate(None,'acgt')):
    return s.translate(None,chars_to_remove)

import timeit

s = 'ag ct oso gcota'
for func in "test_re","test_join1","test_join2","translate":
    print func,timeit.timeit('{0}(s)'.format(func),'from __main__ import s,{0}'.format(func))

可悲的是(对我来说), regex赢得我的机器上:

test_re 0.901512145996
test_join1 6.00346088409
test_join2 3.66561293602
translate 1.0741918087


Answer 3:

没有人upvoting之前测试mgilson的test_re()函数? 到的参数应用re.sub()是相反的,所以这是一个空字符串做替换,总是返回空字符串。

我在Python 3.4的工作; string.translate()只需要一个参数,一个字典。 因为在构建这个字典的开销,我把它的功能。 为了公平起见,我也感动了正则表达式编译出来的功能(这并没有做出明显的区别)。

import re
import string

regex=re.compile('[^atgc]')

chars_to_remove = string.printable.translate({ ord('a'): None, ord('c'): None, ord('g'): None, ord('t'): None })
cmap = {}
for c in chars_to_remove:
    cmap[ord(c)] = None

def test_re(s):
    return regex.sub('',s)

def test_join1(s,chars_keep=set('atgc')):
    return ''.join(c for c in s if c in chars_keep)

def test_join2(s,chars_keep=set('atgc')):
    """ list-comp is faster, but less 'idiomatic' """
    return ''.join([c for c in s if c in chars_keep])

def translate(s):
    return s.translate(cmap)

import timeit

s = 'ag ct oso gcota'
for func in "test_re","test_join1","test_join2","translate":
    print(func,timeit.timeit('{0}(s)'.format(func),'from __main__ import s,{0}'.format(func)))

这里是计时:

test_re 3.3141989699797705
test_join1 2.4452173250028864
test_join2 2.081048655003542
translate 1.9390292020107154

这太糟糕了string.translate()没有一个选项来控制如何处理不在地图上的字符做。 当前的实现是要留住他们,但我们也可以同样可以选择将其删除,在情况下,我们要保持角色远比我们要删除的那些较少(哦,你好,Unicode)的。



文章来源: Keeping only certain characters in a string using Python?