2012-04-25 110 views
5

我是一名python新手,但在其他語言中編寫了一段時間。我有一串DNA(小寫)和AA序列(大寫)。進一步在文件的開頭我有一個大寫的蛋白質名稱。因此我的文件看起來像這樣。如何使用python在字符串中查找第一個非大寫字母

PROTEINNAMEatcgatcg ... JFENVKDFDFLK

我需要找到字符串中的第一個非大寫字母,這樣我就可以再切出蛋白質的名稱。因此,我會從上面要的是:

atcgatcg ... JFENVKDFDFLK

我可以用一個循環做到這一點,但似乎有點小題大做,效率低下。有沒有簡單的Python方法來做到這一點?

我可以使用re.findall(「[A-Z]」,mystring)獲取所有大寫字母,但是之後我需要做一個比較來查看結果與原始字符串的不同之處。

謝謝!

回答

4

你幾乎有你的正則表達式...但也有其他方法,除了的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' 

不確定的表現,但你也可以做

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

而你有它:

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 

第二個看起來要快3倍。

+0

lstrip正是我所需要的東西。用我的其他代碼工作就像一個魅力! – user1357015 2012-04-25 19:35:49

1

使用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

這也可以,但需要額外的切割步驟。儘管我還在學習,但對我很有幫助。謝謝! – user1357015 2012-04-25 19:39:41

0

試試這個,這是因爲短,因爲它可以得到:

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 
相關問題