2012-04-25 17 views
5

Jestem początkującym pytonem, ale zaprogramowałem go w innych językach. Mam długi ciąg sekwencji DNA (małe litery) i AA (duże litery). Dalej na początku pliku mam nazwę białka wszystko pisane wielkimi literami. Tak więc mój plik wygląda tak.Jak znaleźć pierwszą małą literę w ciągu używając python

PROTEINNAMEatcgatcg ... JFENVKDFDFLK

muszę znaleźć pierwsze non-wielkiej litery w łańcuchu więc mogę następnie wyciąć nazwę białek. Tak więc, co chciałbym z powyższego jest:

atcgatcg ... JFENVKDFDFLK

mogę to zrobić za pomocą pętli, ale to wydaje się przesadą i nieefektywne. Czy jest to po prostu sposób Pythona?

Mogę uzyskać wszystkie wielkie litery za pomocą re.findall ("[A-Z]", mystring), ale wtedy muszę zrobić porównanie, aby zobaczyć, gdzie wynik różni się od oryginalnego napisu.

Dzięki!

Odpowiedz

4

Jesteś prawie tam z regex ... ale istnieją inne sposoby oprócz 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' 

Nie wiesz, o wydajności, ale można też zrobić

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

I tam masz:

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 

Druga wygląda około 3 razy szybciej.

+0

lstrip było dokładnie to, czego potrzebowałem. Pracowałem jak czar z moim innym kodem! – user1357015

1

Zastosowanie 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

To też by działało, ale wymagałoby dodatkowego etapu cięcia. Bardzo mi to pomogło, ponieważ wciąż się uczę. Dzięki! – user1357015

0

Spróbuj tego, to jest tak krótki, jak to może dostać:

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 
Powiązane problemy