2012-04-25 67 views
5

Tôi là một newbie python nhưng đã được lập trình một lúc bằng các ngôn ngữ khác. Tôi có một chuỗi dài DNA (chữ thường) và chuỗi AA (chữ hoa). Hơn nữa ở đầu của tập tin tôi có một tên protein tất cả trong trường hợp trên. Vì vậy, tập tin của tôi trông như thế này.Cách tìm chữ cái không phải chữ hoa đầu tiên trong chuỗi bằng cách sử dụng python

PROTEINNAMEatcgatcg ... JFENVKDFDFLK

tôi cần phải tìm ra chữ cái không phải chữ hoa đầu tiên trong chuỗi vì vậy tôi sau đó có thể cắt ra tên protein. Vì vậy, những gì tôi muốn từ trên là:

atcgatcg ... JFENVKDFDFLK

tôi có thể làm điều này với một vòng lặp nhưng điều đó dường như quá mức cần thiết và không hiệu quả. Có cách nào đơn giản là python để làm điều đó?

Tôi có thể nhận được tất cả các chữ hoa sử dụng re.findall ("[A-Z]", mystring) nhưng sau đó tôi sẽ cần phải so sánh để xem kết quả khác với chuỗi gốc.

Cảm ơn!

Trả lời

4

Bạn đang ở gần đó với regex của bạn ... nhưng có những phương pháp khác ngoài 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' 

Không chắc về hiệu suất, nhưng bạn cũng có thể làm

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

Và ở đó bạn có nó:

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 

Thứ hai có vẻ nhanh gấp 3 lần.

+0

lstrip là chính xác những gì tôi cần. Làm việc như một sự quyến rũ với mã khác của tôi! – user1357015

1

Sử dụng 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

Điều này sẽ làm việc quá nhưng sẽ yêu cầu thêm một bước cắt. Rất hữu ích với tôi mặc dù tôi vẫn đang học. Cảm ơn! – user1357015

0

Hãy thử điều này, đó là càng ngắn vì nó có thể nhận được:

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 
Các vấn đề liên quan