2017-03-21 57 views
-1

我有這樣的順序:拆分文本的短語和一一列舉

 
>my_sequence 
atccagcaaaaacgctccaaggattctcgactggactcattacttaatcagtattcgcaagcggacgccgaggtcgtaaaggctgaaaccgcacaatcggatgcgcccagtgatgacgcactxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcgccttgcccacccaccgacaaccggtgagtgaaaaattggaacggtgattaaaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxttgtgctttatttctggagggcggtgtttaggggtaggcgcgccatgttttttgccttcagcgatcccaggtacaaccagtccccatattcgcgcactgtcgtgatcggcgagtaattacctgtgctcgcatcttgcaggttggcaatcaccttgccgtccaagtccagacccagtgcaaaggcacgcttttccatgggtttgggcagtaccgtcaatgcccgaacaatcattttgc 

我想拆分此長序列消除「XXXXX」,創造分離順序是這樣的:

 
>1 
atccagcaaaaacgctccaaggattctcgactggactcattacttaatcagtattcgcaagcggacgccgaggtcgtaaaggctgaaaccgcacaatcggatgcgcccagtgatgacgcact 
>2 
cgccttgcccacccaccgacaaccggtgagtgaaaaattggaacggtgattaaa 
>3 
ttgtgctttatttctggagggcggtgtttaggggtaggcgcgccatgttttttgccttcagcgatcccaggtacaaccagtccccatattcgcgcactgtcgtgatcggcgagtaattacctgtgctcgcatcttgcaggttggcaatcaccttgccgtccaagtccagacccagtgcaaaggcacgcttttccatgggtttgggcagtaccgtcaatgcccgaacaatcattttgc 

有誰有什麼想法開始?

謝謝。

+1

第一步驟:'用於biopython'解析器FASTA文件。這是一個好方法 –

+1

第二步:使用'split'函數或'regex' –

+1

第三步,使用'biopython'保存並格式化輸出 –

回答

4

一個簡單的方法是將在每個「X」字符首先分裂,然後濾出空的結果:

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

這裏,None參數濾波器裝置只保持truthy值 - 空字符串被視爲false,因此它們將從結果中刪除。

注:在Python 3,filter返回一個迭代器,所以如果你想有一個列表,使用:

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'] 
+2

你可以將它轉換爲Python 3用戶的'list'嗎? –

+0

@ Ev.Kounis完成 - 感謝您的建議! –

2

如果你想爲XS的每個序列的單個條目,你可以使用正則表達式:

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

這裏r'x+'意味着我將在分割原始字符串一個或多個xs的序列。

1

讓期望的輸出使用list comprehension的另一種方法是使用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