2012-04-25 2 views
5

Ich bin ein Python-Neuling, aber habe eine Weile in anderen Sprachen programmiert. Ich habe eine lange Reihe von DNA (Kleinbuchstaben) und AA-Sequenzen (Großbuchstaben). Weiter am Anfang der Datei habe ich einen Proteinnamen in Großbuchstaben. Also sieht meine Datei so aus.So finden Sie den ersten Großbuchstaben in der Zeichenfolge mit Python

PROTEINNAMEatcgatcg ... JFENVKDFDFLK

Ich brauche die ersten nicht-Großbuchstaben in der Zeichenfolge zu finden, damit ich ausgeschnitten dann das Protein Namen. So, was ich von der oben wünschen würde, ist:

atcgatcg ... JFENVKDFDFLK

Ich kann dies mit einer Schleife tun, aber das scheint übertrieben und ineffizient. Gibt es einen einfachen Python-Weg, um es zu tun?

Ich kann alle Großbuchstaben mit re.findall ("[A-Z]", mystring), aber dann würde ich einen Vergleich durchführen müssen, um zu sehen, wo das Ergebnis von der ursprünglichen Zeichenfolge abweicht.

Danke!

Antwort

4

Sie sind fast da mit Ihrem regex ... aber es gibt andere Methoden außer findall:

http://docs.python.org/library/re.html#re.sub

>>> import re 
>>> protein_regex = re.compile('^[A-Z]+') 
>>> dna = 'PROTEINNAMEatcgatcg... JFENVKDFDFLK' 
>>> protein_regex.sub('', dna) 
'atcgatcg... JFENVKDFDFLK' 

über die Leistung nicht sicher, aber Sie tun können, auch

>>> import string 
>>> dna.lstrip(string.uppercase) 
'atcgatcg... JFENVKDFDFLK' 

Und da hast du es:

python -m timeit -n 10000 -s 'import re' -s 'protein_regex = re.compile("^[A-Z]+")' -s 'dna = "PROTEINNAMEatcgatcg... JFENVKDFDFLK"' 'protein_regex.sub("", dna)' 
10000 loops, best of 3: 1.36 usec per loop 

python -m timeit -n 10000 -s 'import string' -s 'dna = "PROTEINNAMEatcgatcg... JFENVKDFDFLK"' 'dna.lstrip(string.uppercase)' 
10000 loops, best of 3: 0.444 usec per loop 

Der zweite scheint ~ 3 mal schneller zu sein.

+0

lstrip war genau das, was ich brauchte. Arbeitete wie ein Zauber mit meinem anderen Code! – user1357015

1

Verwendung re.search():

import re 
s1 = "ASDFASDFASDFasdfasdfasdfasdfasdf" 
m = re.search("[a-z]", s1) 
if m: 
    print "Digit found at position %d" % m.start() 
else: 
    print "No digit in that string" 
+0

Dies würde auch funktionieren, aber würde einen zusätzlichen Schritt des Schneidens erfordern. Sehr hilfreich für mich, da ich immer noch lerne. Vielen Dank! – user1357015

0

die Sie interessieren, dann ist es so kurz wie es bekommen kann:

import re 
s = 'PROTEINNAMEatcgatcg... JFENVKDFDFLK' 
i = re.search('[a-z]', s).start() 
protein, sequences = s[:i], s[i:] 

print protein 
> PROTEINNAME 

print sequences 
> atcgatcg... JFENVKDFDFLK 
Verwandte Themen