将文本拆分为短语并枚举它们

Split text to phrases and enumerate them

我有这个序列:

>my_sequence
atccagcaaaaacgctccaaggattctcgactggactcattacttaatcagtattcgcaagcggacgccgaggtcgtaaaggctgaaaccgcacaatcggatgcgcccagtgatgacgcactxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcgccttgcccacccaccgacaaccggtgagtgaaaaattggaacggtgattaaaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxttgtgctttatttctggagggcggtgtttaggggtaggcgcgccatgttttttgccttcagcgatcccaggtacaaccagtccccatattcgcgcactgtcgtgatcggcgagtaattacctgtgctcgcatcttgcaggttggcaatcaccttgccgtccaagtccagacccagtgcaaaggcacgcttttccatgggtttgggcagtaccgtcaatgcccgaacaatcattttgc

我想拆分这个长序列以消除 "xxxxx" 并像这样创建单独的序列:

>1
atccagcaaaaacgctccaaggattctcgactggactcattacttaatcagtattcgcaagcggacgccgaggtcgtaaaggctgaaaccgcacaatcggatgcgcccagtgatgacgcact
>2
cgccttgcccacccaccgacaaccggtgagtgaaaaattggaacggtgattaaa  
>3
ttgtgctttatttctggagggcggtgtttaggggtaggcgcgccatgttttttgccttcagcgatcccaggtacaaccagtccccatattcgcgcactgtcgtgatcggcgagtaattacctgtgctcgcatcttgcaggttggcaatcaccttgccgtccaagtccagacccagtgcaaaggcacgcttttccatgggtttgggcagtaccgtcaatgcccgaacaatcattttgc

有人知道要开始吗?

谢谢。

一个简单的方法是首先拆分每个 "x" 字符,然后过滤掉空结果:

sequences = filter(None, my_sequence.split("x"))

在这里,过滤器的 None 参数意味着只保留真值——空字符串被视为 false,因此它们将从结果中删除。

注意:在 Python 3 中,filter returns 是一个迭代器,所以如果你想要一个列表,请使用:

sequences = list(filter(None, my_sequence.split("x")))

例如:

In [5]: filter(str, my_sequence.split("x"))
Out[5]: 
['atccagcaaaaacgctccaaggattctcgactggactcattacttaatcagtattcgcaagcggacgccgaggtcgtaaaggctgaaaccgcacaatcggatgcgcccagtgatgacgcact',
 'cgccttgcccacccaccgacaaccggtgagtgaaaaattggaacggtgattaaa',
 'ttgtgctttatttctggagggcggtgtttaggggtaggcgcgccatgttttttgccttcagcgatcccaggtacaaccagtccccatattcgcgcactgtcgtgatcggcgagtaattacctgtgctcgcatcttgcaggttggcaatcaccttgccgtccaagtccagacccagtgcaaaggcacgcttttccatgggtttgggcagtaccgtcaatgcccgaacaatcattttgc']

另一个解决方案是使用正则表达式。如果序列之间有可变数量的 "x" 个字符,则可以按 x+ 模式拆分,该模式匹配一​​行中的一个或多个 x。

例如:

In [6]: import re
In [7]: p = re.compile(r'x+')
In [8]: p.split(my_sequence)
Out[8]: 
['atccagcaaaaacgctccaaggattctcgactggactcattacttaatcagtattcgcaagcggacgccgaggtcgtaaaggctgaaaccgcacaatcggatgcgcccagtgatgacgcact',
 'cgccttgcccacccaccgacaaccggtgagtgaaaaattggaacggtgattaaa',
 'ttgtgctttatttctggagggcggtgtttaggggtaggcgcgccatgttttttgccttcagcgatcccaggtacaaccagtccccatattcgcgcactgtcgtgatcggcgagtaattacctgtgctcgcatcttgcaggttggcaatcaccttgccgtccaagtccagacccagtgcaaaggcacgcttttccatgggtttgggcagtaccgtcaatgcccgaacaatcattttgc']

如果您想为 x-s 的每个序列创建一个条目,您可以使用正则表达式:

import re
x = 'atccagcaaaaacgctccaaggattctcgactggactcattacttaatcagtattcgcaagcggacgccgaggtcgtaaaggctgaaaccgcacaatcggatgcgcccagtgatgacgcactxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcgccttgcccacccaccgacaaccggtgagtgaaaaattggaacggtgattaaaxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxttgtgctttatttctggagggcggtgtttaggggtaggcgcgccatgttttttgccttcagcgatcccaggtacaaccagtccccatattcgcgcactgtcgtgatcggcgagtaattacctgtgctcgcatcttgcaggttggcaatcaccttgccgtccaagtcc
agacccagtgcaaaggcacgcttttccatgggtttgggcagtaccgtcaatgcccgaacaatcattttgc'
re.split(r'x+', x)
>['atccagcaaaaacgctccaaggattctcgactggactcattacttaatcagtattcgcaagcggacgccgaggtcgtaaaggctgaaaccgcacaatcggatgcgcccagtgatgacgcact',
 'cgccttgcccacccaccgacaaccggtgagtgaaaaattggaacggtgattaaa',
 'ttgtgctttatttctggagggcggtgtttaggggtaggcgcgccatgttttttgccttcagcgatcccaggtacaaccagtccccatattcgcgcactgtcgtgatcggcgagtaattacctgtgctcgcatcttgcaggttggcaatcaccttgccgtccaagtccagacccagtgcaaaggcacgcttttccatgggtttgggcagtaccgtcaatgcccgaacaatcattttgc']

这里r'x+'表示我将在一个或多个x-s的序列上拆分原始字符串。

另一种获得所需输出的方法是使用 list comprehension

这是一个例子:

# Or maybe a generator
# data = (k for k in my_sequence.split("x") if k)
data = [k for k in my_sequence.split("x") if k]

for k,v in enumerate(data):
    print("{0} >>> {1}".format(k,v))

输出:

0 >>> atccagcaaaaacgctccaaggattctcgactggactcattacttaatcagtattcgcaagcggacgccgaggtcgtaaaggctgaaaccgcacaatcggatgcgcccagtgatgacgcact
1 >>> cgccttgcccacccaccgacaaccggtgagtgaaaaattggaacggtgattaaa
2 >>> ttgtgctttatttctggagggcggtgtttaggggtaggcgcgccatgttttttgccttcagcgatcccaggtacaaccagtccccatattcgcgcactgtcgtgatcggcgagtaattacctgtgctcgcatcttgcaggttggcaatcaccttgccgtccaagtccagacccagtgcaaaggcacgcttttccatgggtttgggcagtaccgtcaatgcccgaacaatcattttgc