2014-12-06 59 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: 
相關問題