2012-04-25 30 views
5

私はPython初心者ですが、他の言語ではしばらくプログラムしました。私は長いDNA鎖(小文字)とAA配列(大文字)を持っています。さらにファイルの先頭には、大文字のタンパク質名があります。したがって、私のファイルはこのように見えます。Pythonを使用して文字列の最初の大文字でない文字を見つける方法

PROTEINNAMEatcgatcg ... JFENVKDFDFLK

私はその後、タンパク質名を切り出すことができるように、文字列の最初の非大文字を見つける必要があります。 ... JFENVKDFDFLK

私はループでこれを行うことができます

atcgatcgが、それはやり過ぎと非効率的なように思える:したがって、私は上から望むものです。それを行うための単純な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 

もう1つは〜3倍速く見えます。

+0

lstripは、私がまさに必要でした。私の他のコードで魅力的に働いた! – user1357015

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

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 
関連する問題