2014-12-06 39 views
0

我有文件,这样输入:蟒蛇regex-获得两个字符之间的所有内容(除了 n)的多行字符串

>X0 
CUUGACGAUCA 
CGCAUCG 
>X55 
UACGGCGG 
UUCAGC 
AUCG 
>X300 
AAACCCGGGG 

,我需要得到“>”字符之间线路的串联:

CUUGACGAUCACGCAUCG 
UACGGCGGUUCAGCAUCG 
AAACCCGGGG 

我的尝试是使用"re.match(r'^>.*\n(.*)>.*' ,a,re.DOTALL)"然后删除“\ n”从每一场比赛,但正则表达式不返回任何东西。我错在哪里?

回答

1

有些人在遇到问题时会想:“我知道,我会用正则表达式。”现在他们有两个问题。 - 杰米Zawinski

这就是说,为什么不做这个更容易理解的字符串处理?

tmp = [] 
seqs = [] 
with open('txtfile') as f: 
    for line in f: 
     if line.startswith('>'): 
      seqs.append(''.join(tmp)) 
      tmp = [] 
     else: 
      tmp.append(line.strip()) 
    else: 
     seqs.pop(0) 
     seqs.append(''.join(tmp)) 

或者,如果你真的想使用正则表达式,你可以尝试先用>X[digit]模式剥离换行,然后拆分:

re.split(r'>X\d+', re.sub(r'\n', '', data)) 

但是,有整个文本文件有缺点被加载到变量data中,这对于大文件(其在生物信息学中是相当常见的)不那么有趣。因此,即便如此,首先给出的方法更有趣,记忆方面,因为您可以依次处理每个完成的DNA/RNA序列。

0

一个正则表达式将工作做好这个应用程序,但有正则表达式要做到这一点,你需要使用一个前向断言。这基本上意味着正则表达式查找但不消费在前瞻(?=...)内定义的内容,其中...用于展望未来。

因此,将这一成一个完整的模式,你会得到这样的:

>(.+?)(?=>|$) 

蒸馏此,这种模式会查找>为出发点,然后抓住一切都交给在那里看到了点或者另一个>或字符串的结尾,但是 - 这是关键 - 它不消耗结尾>,因此它可用于启动下一个实例。

您还需要使用DOTALL标志,以确保新行符合.findall函数返回的所有比赛。

所以,像这样将工作:

#!/usr/env/python 

import re 

string = """>X0 
CUUGACGAUCA 
CGCAUCG 
>X55 
UACGGCGG 
UUCAGC 
AUCG 
>X300 
AAACCCGGGG""" 

res = re.findall('>(.+?)(?=>|$)', string, re.DOTALL) 

print "results: {0}".format(res) 

输出是:

results: ['X0\nCUUGACGAUCA\nCGCAUCG\n', 'X55\nUACGGCGG\nUUCAGC\nAUCG\n', 'X300\nAAACCCGGGG'] 

更多的正则表达式的详细信息,请参见Python regex doc

如果您不想在结果中使用换行符,则可以使用string.replace从列表中的每个项目中删除这些行。

1

我会做简单:

s = file.read() #or whatever string yu have 
sar = "".join(s.split()) #this will remove newlines 
sar = sar.split('>') #processing your splitter 
for tstr in sar: 
    print tstr #this is the concatenation of lines between '>' characters: 
相关问题