7

私はPythonの初心者ですが、他の言語でしばらくプログラミングしました。DNA (小文字) と AA シーケンス (大文字) の長い文字列があります。さらにファイルの先頭には、すべて大文字のタンパク質名があります。したがって、私のファイルは次のようになります。

PROTEINNAMEatcgatcg... JFENVKDFDFLK

文字列内の最初の大文字以外の文字を見つけて、タンパク質名を切り出す必要があります。したがって、私が上記から望むことは次のとおりです。

atcgatcg... JFENVKDFDFLK

ループでこれを行うことができますが、それはやり過ぎで非効率的です。それを行うための単純なpythonの方法はありますか?

re.findall("[AZ]",mystring) を使用してすべての大文字を取得できますが、結果が元の文字列とどこが異なるかを確認するために比較を行う必要があります。

ありがとう!

4

4 に答える 4

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

2 つ目は ~3 倍高速に見えます。

于 2012-04-25T19:09:34.153 に答える
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"
于 2012-04-25T19:13:29.103 に答える
1

これを試してみてください。できる限り短いです:

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
于 2012-04-25T19:23:34.770 に答える