【问题标题】:regex python Fasta正则表达式 python Fasta
【发布时间】:2013-02-18 15:29:39
【问题描述】:

感谢您之前的建议,

我还有一个正则表达式问题:

现在我有一个带有这种模式的列表:

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

还有一个 Fasta 格式的 DNA 测序文件:

EDIT 重新格式化的行

>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)

脚本似乎可以工作,但我认为模式不正确,因为创建的文件是空的。

提前感谢您的宝贵建议。

【问题讨论】:

  • 嘿,这里有一些提示:你提到了两个文件......这是你显示的代码 sn-p 中的那些?您要使用的正则表达式可能是r'\*(\d+)\s+'(越具体越好)。
  • Fasta 文件是否有序? >OCTO1 ... >OCTnn,这样就可以得到数字列表,然后得到n'th * 2 行?我对您的 Q 进行了编辑,因为它没有显示 >,因为它在标记中很特殊。
  • 感谢您的建议,对于dsign来说,这两个文件是“a”和“b”(b代表fasta,a是列表),我知道模式应该尽可能具体,但在 fasta 文件中我没有 * 符号.....对于 sotapme 是的,Fasta 文件是 >OCTU1\nACGTTCCAT.....\n>OCTU2\nGCTACCT\n....我没有意识到文字书写不正确....对不起

标签: python regex dna-sequence


【解决方案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)

【讨论】:

  • 谢谢,这是一个很好的解决方案!通过这种方式,我得到了一个包含所有序列的 .txt 文件,但没有 >OCTU(\d+) 的 ID。
  • 我已经尝试了几种解决方案来在同一个文件中获取所有信息,是否有一种方法可以同时写入 m 和序列?
  • @user2072622 >OCTU 行在变量line 中,只需将其写出来。见编辑。
  • 感谢您的宝贵建议,脚本有效,但只有当我分别处理两个“for”迭代时,当我尝试按顺序迭代这两个步骤时,第一个“for”循环只写出第一个 OTU。我无法找出问题所在
  • @user2072622 这个想法正是首先循环遍历所有a,然后循环遍历b。这样你只需要读取每个文件一次。
【解决方案2】:

您可能想使用 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")

【讨论】:

    【解决方案3】:

    编码=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"" 作为测试字符串和替换的前缀。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-12
      • 2011-08-06
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 2014-11-08
      相关资源
      最近更新 更多