2012-04-25 10 views
5

Sono un novizio pitone ma ho programmato un po 'di tempo in altre lingue. Ho una lunga serie di sequenze di DNA (lettere minuscole) e AA (lettere maiuscole). Inoltre all'inizio del file ho un nome di proteina tutto in maiuscolo. Quindi il mio file sembra così.Come trovare la prima lettera maiuscola nella stringa usando python

PROTEINNAMEatcgatcg ... JFENVKDFDFLK

ho bisogno di trovare la prima lettera maiuscola non nella stringa in modo da poter poi tagliare fuori il nome della proteina. Così, quello che vorrei da quanto precede è:

atcgatcg ... JFENVKDFDFLK

posso fare questo con un ciclo, ma che sembra eccessivo e inefficiente. C'è un modo semplicemente pitone per farlo?

Posso ottenere tutte le lettere maiuscole utilizzando re.findall ("[A-Z]", mystring), ma poi avrei bisogno di fare un confronto per vedere dove il risultato differisce dalla stringa originale.

Grazie!

risposta

4

siete quasi arrivati ​​con la vostra espressione regolare ... ma ci sono altri metodi oltre 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' 

Non sei sicuro di prestazioni, ma si potrebbe anche fare

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

Ed ecco:

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 

Secondo, sembra essere ~ 3 volte più veloce.

+0

lstrip era esattamente quello che mi serviva. Ha funzionato come un fascino con il mio altro codice! – user1357015

1

Usa 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

Anche questo funzionerebbe, ma richiederebbe un ulteriore passaggio di taglio. Molto utile per me anche se sto ancora imparando. Grazie! – user1357015

0

Prova questa, è il più breve come si può ottenere:

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 
Problemi correlati