2012-09-23 37 views
0

所以我想写一个脚本,读取一个文件,并提取2个值,一旦发现某个单词。在这种情况下,当遇到字符串'exon'时,它会保存后面的两个整数。在字符串列表中,在字符串中查找一个短语并将两个整数(x..y)以字符串形式附加到列表中。 Python

我开始通过创建空字符串:

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 

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

我只需要找出我究竟该如何发现“外显子”它需要查找该行,直到找到“..”,然后将其侧面的整数附加到其相应的列表中;即

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

回答

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'] 
+0

@TimPietzcker啊,是的,你是绝对正确的。除非“exon”是他的简单例子,否则不需要're'。 –

+0

雅它的工作,但我怎么追加侧面的'..'在每一行的值? –

+0

@ draconisthe0ry您可以简单地使用'split()'来解析它,就像我刚刚在更新后的答案中所示。 –

相关问题