2012-04-25 8 views
5

Soy un principiante de Python pero he programado un tiempo en otros idiomas. Tengo una larga cadena de ADN (minúsculas) y secuencias AA (mayúsculas). Además, al comienzo del archivo, tengo un nombre de proteína en mayúsculas. Por lo tanto, mi archivo se ve así.Cómo encontrar la primera letra que no sea mayúscula en la cadena usando python

PROTEINNAMEatcgatcg ... JFENVKDFDFLK

Necesito encontrar la primera letra en mayúscula no en la cadena de modo que puedo entonces cortar el nombre de la proteína. Por lo tanto, lo que yo quiero de lo anterior es:

atcgatcg ... JFENVKDFDFLK

puedo hacer esto con un bucle, pero que parece un exceso e ineficiente. ¿Hay una forma sencilla de Python para hacerlo?

Puedo obtener todas las letras mayúsculas con re.findall ("[A-Z]", mystring) pero luego tendría que hacer una comparación para ver dónde difiere el resultado de la cadena original.

Gracias!

Respuesta

4

Usted está casi allí con su expresión regular ... pero hay otros métodos además 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' 

No estoy seguro sobre el rendimiento, pero también se puede hacer

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

Y ahí lo tienes:

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 

El segundo parece ser ~ 3 veces más rápido.

+0

lstrip era exactamente lo que necesitaba. Funcionó como un encanto con mi otro código! – user1357015

1

Uso 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

Esto funcionaría también pero requeriría un paso adicional de corte. Muy útil para mí, ya que todavía estoy aprendiendo. ¡Gracias! – user1357015

0

Prueba de esto, es tan corto como se puede conseguir:

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 
Cuestiones relacionadas