7

我是 python 新手,但用其他语言编程了一段时间。我有一长串 DNA(小写)和 AA 序列(大写)。在文件的开头,我有一个全部大写的蛋白质名称。因此我的文件看起来像这样。

蛋白质名称atcgatcg... 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

第二个看起来要快 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 回答
0

istitle 可以是一个有用的函数来确定字符串是否包含大写字母。

    def check_uppercase(name) :
         
        for i in range(0, len(name)) :
             
            if (name[i].istitle()) :
                return name[i]
                 
        return 0
    
    name = "myCode"
    value = check_uppercase(name)
     
    if (value == 0) :
        print("No uppercase letter")
    else :
        print(value)


    #output: C
于 2021-09-14T04:12:18.403 回答