2013-02-18 50 views
0

謝謝您之前的建議,正則表達式蟒蛇FASTA

我有另一個正則表達式的問題:

現在我有這個模式的列表:

*7 3 279 0 
*33 2 254 0.0233918128654971 
*39 2 276 0.027431421446384 

,並用DNA測序文件FASTA格式:

編輯重新格式化線

>OCTU1 
GCTTGTCTCAAAGATTAAGCCATGCATGTATAAGCACAAGCCTAAAATGGTGAAGCCGCGAATAGCTCATTACAACAGTCGTAGTTTATTGGAAAGTTCACTATGGATAACTGTGGTAATTCTAGAGCTAATACATGTTCCAATCCTCGACTCACGGAGAGGTGCATTTATTAGAACAAAGCTGATCAGACTATGTCTGTCTCAGGTTGACTCTGAATAACTTTGCTAATCGCACAGTCTTTGTACTGGCGATGTATCTTTCATGCTATGTA 
>OCTU2 
GCTGCTTCCTTGGATGTGGTAGCCGTTTCTCAGGCTCCCTCTCCGGAATCGAACCCTATTCCCCGTTACCCGTTCAACCATGGTAGGCCCTACTACCATCAAAGTTGATAGGGCAGATATTTGAAAGACATCGCCGCACAAAGGCTATGCGATTAGCAAAGTTATTAGATCAACGACGCAGCGATCGGCTTTGACTAATAAATCACCCCTCCAGTTGGGGACTTTTACATGTATTAGCTCTAGAATTACCACAGTTATCCATTAGTGAAGTACCTTCCAATAAACTATACTGTTTAATGAGCCATTCGCGGTTTCACCGTAAAATTAGGTTGTCTTAGACATGCATGGCTTAATCTTTGTAGACAAGC 

我需要在Fasta文件(例如,> OCTU7和> OCTU33)中查找列表中帶有*(例如7或33)的數字,並將另一個文件複製到僅存在的Fasta序列在列表中,這是我的腳本:

regex=re.compile(r'.+\d+\s+') 
OCTU=b.readlines() 
while OCTU: 
    for line in a: 
     if regex.match(OCTU)==line: 
       c.write(OCTU) 

腳本,似乎工作,但我認爲該模式是不正確的,因爲創建該文件是空的。

非常感謝您的寶貴意見。

+0

嘿,這裏有一些提示:你提到了兩個文件......哪些是你顯示的代碼片段?你想使用的正則表達式可能是'r'\ *(\ d +)\ s +''(越具體越好)。 – dsign 2013-02-18 15:42:50

+0

是否是Fasta文件? ''> OCTO1 ...> OCTnn'',這樣就可以得到數字列表,然後得到第n'* 2'行。我編輯了你的Q,因爲它沒有顯示''''',因爲這在標記中是特殊的。 – sotapme 2013-02-18 16:36:39

+0

感謝您的建議,對於dsign,這兩個文件是「a」和「b」(b代表fasta,a是列表),我知道該模式應儘可能具體,但在fasta文件中,我沒有*符號.....對於sotapme是Fasta文件是> OCTU1 \ nACGTTCCAT ..... \ n> OCTU2 \ nGCTACCT \ n ....我沒有意識到在文本中它沒有被正確寫入....對不起 – user2072622 2013-02-19 08:43:52

回答

1

你可以先收集從文件a ID號一組快速查找後:

seta = set() 
regexa = re.compile(r'\*(\d+)') #matches asterisk followed by digits, captures digits 
for line in a: 
    m = regexa.match(line)  #looks for match at start of line 
    if m: 
     seta.add(m.group(1)) 

然後在B個循環。在循環內使用b.next()以獲取序列所在的第二行。

regexb = re.compile(r'>OCTU(\d+)') #matches ">OCTU" followed by digits, captures digits 
for line in b: 
    m = regexb.match(line) 
    if m: 
     sequence = b.next() 
     if m.group(1) in seta: 
      c.write(line) 
      c.write(sequence) 
+0

謝謝,這是一個很好的解決方案!以這種方式,我得到一個帶有所有序列的.txt文件,但沒有> OCTU(\ d +)的ID。 – user2072622 2013-02-22 14:55:14

+0

我已經嘗試了幾種解決方案來獲取同一個文件中的所有信息,tere是一種寫m和sequence的方法嗎? – user2072622 2013-02-22 14:56:41

+0

@ user2072622> OCTU行在變量'line'中,簡單地寫出來。請參閱編輯。 – 2013-02-22 17:38:05

0

您可能想使用Biopython解析fasta文件。

然後你就可以切出的號碼,在列表中查找它,更可靠地訪問序列和序列的名字......如果一個FASTA文件有自動換行上述方法可能會遇到的問題...

import collections 
from Bio import SeqIO 

infile = "yourfastafile.fasta" 
outfile = "desired_outfilename.fasta" 

dct = collections.OrderedDict() 
for record in SeqIO.parse(open(infile), "fasta"): 
    dct[record.description()] = str(record.seq).upper() 

for k,v in dct.items(): 
    if int(k[4:]) in seta: #from answer above 
     with open(outfile, "a") as handle: 
      handle.write(">" + k + "\n" + str(v) + "\n") 
0

編碼= UTF8

上述標籤定義的編碼本文檔並且是用於Python 2.x的兼容性

import re 

regex = r">.+\n[acgtnACGTN\n]+" 

test_str = (">AB000263 |acc=AB000263|descr=Homo sapiens mRNA for prepro cortistatin like peptide, complete cds.|len=368\n" 
    "ACAAGATGCCATTGTCCCCCGGCCTCCTGCTGCTGCTGCTCTCCGGGGCCACGGCCACCGCTGCCCTGCC\n" 
    "CCTGGAGGGTGGCCCCACCGGCCGAGACAGCGAGCATATGCAGGAAGCGGCAGGAATAAGGAAAAGCAGC\n" 
    "CTCCTGACTTTCCTCGCTTGGTGGTTTGAGTGGACCTCCCAGGCCAGTGCCGGGCCCCTCATAGGAGAGG\n" 
    "AAGCTCGGGAGGTGGCCAGGCGGCAGGAAGGCGCACCCCCCCAGCAATCCGCGCGCCGGGACAGAATGCC\n" 
    "CTGCAGGAACTTCTTCTGGAAGACCTTCTCCTCCTGCAAATAAAACCTCACCCATGAATGCTCACGCAAG\n" 
    "TTTAATTACAGACCTGAA") 

matches = re.finditer(regex, test_str) 

for matchNum, match in enumerate(matches): 
    matchNum = matchNum + 1 

    print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group())) 

    for groupNum in range(0, len(match.groups())): 
     groupNum = groupNum + 1 

     print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum))) 

注:用於Python 2.7兼容性,使用ur「」作爲正則表達式的前綴,u「」作爲測試字符串和替換的前綴。