0

所以我正在尝试编写一个脚本来读取文件并在找到某个单词后提取 2 个值。在这种情况下,当遇到字符串 'exon' 时,它将保存后面的两个整数。

我从创建空字符串开始:

exon_start = []
exon_end = []

这是我正在使用的简化数据的示例:

for line in data:
    print data

>>>

 exon            1..35
                 /gene="CDKN1A"

 CDS             73..567
                 /translation="MSEPAGDVRQNPCGSKACRRLFGPVDSEQLSRDCDALMAGCIQE
                 ARERWNFDFVTETPLEGDFAWERVRGLGLPKLYLPTGPRRGRDELGGGRRPGTSPALL
                 QGTAEEDHVDLSLSCTLVPRSGEQAEGSPGGPGDSQGRKRRQTSMTDFYHSKRRLIFS
                 KRKP"

 misc_feature    76..78
                 /gene="CDKN1A"


 exon            518..2106
                 /gene="CDKN1A"

我尝试为 re.findall() 函数导入正则表达式模块:

indx_exon = range(0,len(data))

# so this relates each line of the data to a specific number in the index

我无法识别每一行中的“外显子”短语首先我只是试图确定文本的哪一行具有外显子序列,以查看 re.findall() 是否有效,然后我输入:

for p,line in zip(indx_line,data):

    if re.findall(r'exon',line) is True:
        print p

我没有

当我放:

for p,line in zip(indx_line,data):

    exon_test = re.findall(r'exon',line)
    print exon_test

对于不包含 'exon' 的行和确实包含 'exon' 的行,我得到了一堆 [] 他们给了我 'exon' 。所以我知道我可以使用 re.findall() 功能来查找每个字符串中每次出现的“外显子”

我只需要确切地找出当它找到“外显子”时我该怎么说,它需要在该行中查找直到找到“..”,然后将其侧翼的整数附加到相应的列表中;IE

exon_start = [1,518]
exon_end = [35,2106]
4

1 回答 1

1

问题是if re.findall(r'exon',line) is True:在线的。因为re.finall()不会返回TrueFalse。例子:

>>> mystr = '123 exon'
>>> import re
>>> re.findall(r'exon', mystr)
['exon']
>>> re.findall(r'exon', mystr) is True
False
>>> bool(re.findall(r'exon',mystr))
True
>>> if re.findall(r'exon', mystr):
...     print 'true'
... 
true

将原代码改为:

for p,line in zip(indx_line,data):

    if re.findall(r'exon',line):
        print p

应该让它工作。


编辑:正如@TimPietzcker 指出的那样,您根本不需要re在这种情况下使用。为了解决您获得数字侧翼的第二个问题,..以下代码可能会有所帮助:

>>> line = ' exon            1..35'
>>> if 'exon' in line:
...     ranges = line.split()[1].split('..')
...     print ranges
...
['1', '35']
于 2012-09-23T22:12:31.560 回答