2013-02-18 95 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“”作为测试字符串和替换的前缀。