2012-10-28 20 views
4

基本上輸入文件是這樣的:使用re.MULTILINE的和re.DOTALL一起蟒

> U51677人類非組蛋白染色質蛋白質HMG1(HMG1)基因,完整

 cds. #some records don't have this line (see below) 

     Length = 2575 

(一些文本)

> U51677人類非組蛋白染色質蛋白質HMG1(HMG1)基因,完整

 Length = 2575 

(一些文本)

(等)

現在,我寫了這個提取與>啓動線和工作正常,長度

import re 
regex = re.compile("^(>.*)\r\n.*Length\s=\s(\d+)", re.MULTILINE) 
match = regex.findall(sample_blast.read()) 

print match[0] 

數用於在長度線是>行的下一行時提取記錄。

然後我試着re.DOTALL,它應該使任何記錄匹配(。*長度),無論是否有一個額外的行或不。

regex = re.compile("^(>.*)\r\n.*(?:\r\n*.?)Length\s=\s(\d+)", re.MULTILINE|re.DOTALL) 

但它不起作用。我嘗試了re.MULTILINE和re.DOTALL而不是pipe,但仍然無法工作。

所以問題是如何創建匹配記錄的正則表達式並返回所需的組,而不管記錄中是否有多餘的行。如果有人能夠在re.VERBOSE中展示這個,那也會很好。對不起,很長的職位,並感謝提前的任何幫助。 :)

+0

你確定'>'是行上的第一個字符嗎?還有,真的只有'\ r \ n'行結束符或'\ n'行結束符是一個選項嗎?如果在'r'文本中打開'sample_blast'模式然後python可能已經爲你翻譯這些。 –

回答

4

您的問題可能是您使用\r\n。相反,嘗試只用\n

 
>>> x = """ 
... >U51677 Human non-histone chromatin protein HMG1 (HMG1) gene, complete 
... 
...  cds. #some records don't have this line (see below) 
... 
...  Length = 2575 
... (some text) 
... 
... >U51677 Human non-histone chromatin protein HMG1 (HMG1) gene, complete 
... 
...  Length = 2575 
... (some text) 
... 
... (etc...) 
... """ 
>>> re.search("^(>.*)\n.*(?:\n*.?)Length\s=\s(\d+)", x, re.MULTILINE|re.DOTALL) 
<_sre.SRE_Match object at 0x10c937e00> 
>>> _.group(2) 
'2575' 

此外,您的第一.*太貪婪。相反,嘗試使用:^(>.*?)$.*?Length\s=\s(\d+)

 
>>> re.findall("^(>.*?)$.*?Length\s=\s(\d+)", x, re.MULTILINE|re.DOTALL) 
[('>U51677 Human non-histone chromatin protein HMG1 (HMG1) gene, complete', '2575'), ('>U51677 Human non-histone chromatin protein HMG1 (HMG1) gene, complete', '2575')] 
+0

完美。非常感謝:) – bioinformant

+0

@bioinformant爲什麼不接受答案? –

0

試試這個正則表達式:

"^(>[^\r\n]*).*?Length\s=\s(\d+)" 

設置兩個選項(使用管道符號)。

第一個捕獲組將在>(獨立於您的操作系統)之後將所有內容匹配到第一個換行符。然後.*?將匹配任何字符,直到遇到第一個Length。其餘部分與您的第一次嘗試相同。

與你以前嘗試的問題似乎是,你使用.*可以匹配任何東西,是貪婪在同一時間(所以會消耗盡可能多的,因爲它可以包括以下Length = 2575