2017-03-21 1 views
-1

Ich habe diese Sequenz:Split Text Phrasen und aufzählen sie

 
>my_sequence 
atccagcaaaaacgctccaaggattctcgactggactcattacttaatcagtattcgcaagcggacgccgaggtcgtaaaggctgaaaccgcacaatcggatgcgcccagtgatgacgcactxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcgccttgcccacccaccgacaaccggtgagtgaaaaattggaacggtgattaaaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxttgtgctttatttctggagggcggtgtttaggggtaggcgcgccatgttttttgccttcagcgatcccaggtacaaccagtccccatattcgcgcactgtcgtgatcggcgagtaattacctgtgctcgcatcttgcaggttggcaatcaccttgccgtccaagtccagacccagtgcaaaggcacgcttttccatgggtttgggcagtaccgtcaatgcccgaacaatcattttgc 

Ich möchte diese lange Sequenz spalten die „xxxxx“ und erstellen getrennten Sequenzen wie diese zu beseitigen:

 
>1 
atccagcaaaaacgctccaaggattctcgactggactcattacttaatcagtattcgcaagcggacgccgaggtcgtaaaggctgaaaccgcacaatcggatgcgcccagtgatgacgcact 
>2 
cgccttgcccacccaccgacaaccggtgagtgaaaaattggaacggtgattaaa 
>3 
ttgtgctttatttctggagggcggtgtttaggggtaggcgcgccatgttttttgccttcagcgatcccaggtacaaccagtccccatattcgcgcactgtcgtgatcggcgagtaattacctgtgctcgcatcttgcaggttggcaatcaccttgccgtccaagtccagacccagtgcaaaggcacgcttttccatgggtttgggcagtaccgtcaatgcccgaacaatcattttgc 

Hat jemand Hast du eine Idee anzufangen?

Vielen Dank.

+1

1. Schritt: 'biopython' für Parser fasta Datei. Es ist ein guter Weg –

+1

2. Schritt: Verwenden Sie 'split' Funktion oder' regex' –

+1

3. Schritt, verwenden Sie 'biopython' zum Speichern und formatieren Ausgabe –

Antwort

4

Ein einfacher Weg zum ersten Split auf jedem „x“ Zeichen sein würde, und dann die leeren Ergebnisse filtern:

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

Hier werden das None Argument Mittel zu filtern, um nur truthy-Werte zu halten - leer Zeichenfolgen werden als false behandelt, daher werden sie aus den Ergebnissen entfernt.

Hinweis: In Python 3 filter einen Iterator zurückgibt so, wenn Sie eine Liste, zu verwenden:

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

Zum Beispiel:

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

Eine andere Lösung ist reguläre Ausdrücke zu verwenden . Wenn Sie eine variable Anzahl von "x" -Zeichen zwischen den Sequenzen haben, können Sie das Muster x+ teilen, das mit einem oder mehreren x in einer Reihe übereinstimmt.

Zum Beispiel:

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

können Sie das auf "Liste" für Python 3 Benutzer? –

+0

@ Ev.Kounis Fertig - danke für den Vorschlag! –

2

Wenn Sie einen einzelnen Eintrag für jede Folge von xs haben wollen Sie reguläre Ausdrücke verwenden:

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

Hier r'x+' bedeutet, dass ich die ursprüngliche Zeichenfolge aufgeteilt auf eine Sequenz von einem oder mehreren xs.

1

Eine andere Möglichkeit, die gewünschte Ausgabe zu erhalten, ist die Verwendung von list comprehension.

Dies ist ein Beispiel:

# 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)) 

Ausgang:

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