分析DNA序列中的串联重复基序

时间:2018-07-11 07:42:58

标签: python regex dna-sequence

Hy Py-guys :)。由于我是编码领域以及Python的新手,因此我在编码方面没有太多经验,因此将不胜感激。我正在研究DNA序列中的短串联重复序列,我希望有一个代码可以根据指定基因座的串联基序读取和计数重复的核苷酸。

这是我需要的一个例子:


串联主题:

AGAT,AGAC,[AGAT],gat,[AGAT]

输入

  

TTAGTTCAGGATAGTAGTTGTTTGGAAGAGCGCAACTCTCTGAGAAACTTAGTTATTCTCTCATCTATTTAGCTACAGCAAACTTCATGTGACAAAAGCCACACACATATA

已分析的输入:

  

TTAGTTCAGGATAGTAGTTGTTTGGAAGAGCGCAACTCTCTGAGAAACTTAGTTATTCTCTCATCTATTTAGCTACAGCAAACTTCATGTGACAAAAGCCACACCCATAACTTTTTTCCTCT AGATAGACAGATAGATGATAGATAGATATAGTAGGATAGATAGATAGATAGATAGGATAGGATAGGACTATCTTACTATTAGTACTATTAGTACTATCATTATAGTACTATTAGTAGCATTAG

输出

AGAT AGAC (AGAT)2 GAT (AGAT)12 
  • 份数。 (在输出GAT中,即使不算在说明中也用大写字母表示)

等位基因:16

  • 每个图案的总拷贝数(1 + 1 + 2 + 12)

说明

每个地方的串联基序都不相同,因此我需要为每个地方手动指定它(总共约130个基因座)。

因此,在这种情况下,整个主题以AGAT开头,并以AGAT的最后一个副本结束

在串联基序中指定的核苷酸与该定义的基序之前和之后的所有内容之间都没有未知的核苷酸(A / C / T / G)

如您所见,当串联基序中的核苷酸写成小写(门)时,它们不包含在最终等位基因值中

括号中的那些图案可以重复多次

那些不在方括号中–它们在序列中只有一个副本


也可能出现这种情况:


串联主题:

[CTAT],CTAA,[CTAT],N30,[TATC]

输入:

  

TTTGCATGATCTCTTCTTGATCATTTTCTTCCCCCTTTCCTAAAAAATTCTGGTCCTTTGAGGTAACTGCCATTACCATATGAGTTAGTCTGGGTTCTCCAGAGAAACAGAACCAATAGGCTATCTATCTAACTATCTATCTATCTATCTATCTATCTATCTATCTATCTATCTATCTATCTACTATCTCTATATTATCTATCTATCTATTATCTATCTATCTATCTATCTATCTATCTATCTATCTATCTATCTATCTATCATCTATCTATATCTTCTACCAAGTGATTTACTGTAATAAATTAGCTCATGCTATTATGGAGGATGAGTTCAAGATTTGTGGTCAGCAAGTTGCAGACTCA

已分析的输入:

  

TTTGCATGATCTCTTCTTGATCATTTTCTTCCCCCTTTCCTAAAAAATTCTGGTCCTTTGAGGTAACTGCCATTACCATATGAGTTAGTCTGGGTTCTCCAGAGAAACAGAACCAATAGG的 CTATCTATCTAACTATCTATCTATCTATCTATCTATCTATCTATCTATCTATCTATCTATCTACTATCTCTATATTATCTATCTATCTATTATCTATCTATCTATCTATCTATCTATCTATCTATCTATCTATCTATCTATC ATCTATCTATATCTTCTACCAAGTGATTTACTGTAATAAATTAGCTCATGCTATTATGGAGGATGAGTTCAAGATTTGTGGTCAGCAAGTTGCAGACTCA

输出:

(CTAT)2 CTAA (CTAT)12 (TATC)13

等位基因:28

  • (2 + 1 + 12 + 13)

说明

N30表示最终串联重复之前有30个未指定的核苷酸



摘要

主题中可能存在这些类型,需要对其进行定义,并且每个基因座将具有不同的主题组合:

括号:示例[CTAT] – CTAT的多个副本

无括号:CTAT示例–仅一份CTAT

N#:示例N30-表示30个未指定的核苷酸(A / C / G / T)

小写:示例ctat-表示这些不包含在最终等位基因编号中


真实图案的示例:

[CTTT],TT,CT,[CTTT]

[TCTA],[TCTG],[TCTA],ta,[TCTA],tca,[TCTA],tccata,[TCTA],TA,[TCTA]

[TAGA],[CAGA],N48,[TAGA],[CAGA]

[AAGA],[AAGG],[AAGA]

还有更多……


谢谢大家。任何帮助和想法,将不胜感激! :)

2 个答案:

答案 0 :(得分:2)

解决问题的一种好方法是使用regex。常规表达式是编程分析strings的常用方法。
使用正则表达式,您可以定义要在字符串中搜索哪种模式(几乎像您一样),这是问题的核心。
这意味着正则表达式具有自己的格式,与您的格式类似但不相同。
您还可以编写一些代码将格式转换为正则表达式格式,但是您可能还应该编写另一个问题,避免所有DNA问题。

让我们看看正则表达式的工作原理:
这是您的摘要在正则表达式模式中的样子:

  

摘要

     

图案中可能有这些类型,需要定义,每种   位置将具有不同的主题组合:

     

括号:示例[CTAT] – CTAT的多个副本- RegEx: (CTAT)+(一个或多个)或(CTAT)*(零或更多)

     

无括号:示例CTAT –仅一份CTAT- RegEx: (CTAT){1}

     

N#:示例N30-表示30个未指定的核苷酸(A / C / G / T)- RegEx: .{30}

     

小写:示例ctat-表示这些不包含在最终等位基因编号中- RegEx: (?:CTAT)

借助这些知识,我们可以将正则表达式应用于输入:
示例1:

import re # import regex module

tandem = r"((AGAT){1}(AGAC){1}(AGAT)+(?:GAT){1}(AGAT)+)"

mystring = "TTAGTTCAGGATAGTAGTTGTTTGGAAGCGCAACTCTCTGAGAAACTTAGTTATTCTCTCATCTATTTAGCTACAGCAAACTTCATGTGACAAAAGCCACACCCATAACTTTTTTCCTCTAGATAGACAGATAGATGATAGATAGATAGATAGATAGATAGATAGATAGATAGATAGATAGATAGATATAGATTCTCTTTCTCTGCATTCTCATCTATATTTCTGTCTTTCTCTTAATTATGGGTAACTCTTAGCCTGCCAGGCTACCATGGAAAGACAACCTTTAT" #input string

analyzed_input = re.findall(tandem, mystring)[0]

print(analyzed_input) #see the match found

tot = 0
max_len = max((len(al) for al in analyzed_input[1:] if len(al) <= 4)) # longest allele, maximum 4
remaining_string = analyzed_input[0] #string to analyzed. will be cutted in for loop
for allele in analyzed_input[1:]: #for each allele
    section = re.findall(r"((" + re.escape(allele) + ")+)", remaining_string)[0][0] # section where the allele is repeated
    value = section.count(allele) if len(allele) == max_len else section.count(allele)*(len(allele)/10.0) # get the value of the alleles. /10.0 if allele is shorter than the longest allele found
    remaining_string = remaining_string[remaining_string.index(section)+len(section):] # cut away from remaining string the current section
    print("The value of allele {0} is {1}\n".format(allele, value))
    if len(allele) <= 4: #add the allele value if his length is less than 5
        tot += value

print("total allele number is: {0}".format(tot))
  

输出:等位基因总数为:16

在下面的示例中,我仅显示正则表达式tandem,其余代码相同

示例2:

tandem2 = r"((TCTA)+(TCTG)+(TCTA)+(?:TA){1}(TCTA)+(?:TCA){1}(TCTA)+(?:TCCATA){1}(TCTA)+(TA)+(TCTA)+)"
  

输出:等位基因总数是:32.2

示例3:

tandem3 = r"((TCTA)+(TCTG)+(TCTA)+(?:TA){1}(TCTA)+(?:TCA){1}(TCTA)+(?:TCCATA){1}(TCTA)+(TA)*(TCTA)*)"
  

输出:等位基因总数是:31.0

示例4:

tandem4 = r"((CTAT)+(CTAA){1}(CTAT)+(.{30})(TATC)+)"
  

输出:等位基因总数是:28.0

您的其他示例将写为:

[CTTT],TT,CT,[CTTT] r"((CTTT)+(TT){1}(CT){1}(CTTT)+)"

[TCTA],[TCTG],[TCTA],ta,[TCTA],tca,[TCTA],tccata,[TCTA],TA,[TCTA] r"((TCTA)+(TCTG)+(TCTA)+(?:TA){1}(TCTA)+(?:TCA){1}(TCTA)+(?:TCCATA){1}(TCTA)+(TA){1}(TCTA)+)"

[TAGA],[CAGA],N48,[TAGA],[CAGA] r"((TAGA)+(CAGA)+(.{48})(TAGA)+(CAGA)+)"

[AAGA],[AAGG],[AAGA] r"((AAGA)+(AAGG)+(AAGA)+)"

开发一个完整的工作框架将花费一些时间,具体取决于您要实现的灵活性级别,输入类型,自动化...

答案 1 :(得分:1)

很抱歉,我没有时间完成所有案件,但是希望这可以给您一些开始。

设计是一个线性自动机,其带子是核苷酸序列。

我们有一个position(pos)变量,用于标记我们正在处理的序列中的索引。

还有两个正在运行的累积变量:一个output字符串和一个整数alleles

现在,我们已经初始化了设置,我们可以在串联主题字符串中的每个主题上开始迭代。这是通过在逗号上分割字符串来完成的。

然后在for循环内,我们需要确定这是哪种主题情况(例如方括号重复,无括号,N#等)。为了节省时间,我仅在重复的方括号中实施了此操作,因为它很容易演示该过程。

一旦通过了测试用例,则需要处理需要执行的步骤。

例如,在这种情况下,带有方括号的主题重复出现,因此我将初始count变量初始化为0,然后将pos跳转到主题的第一次出现在sequence中,如果pos0-即,如果这是我们的第一个图案,则需要将位置跳到第一次出现的结尾。当我们发现一个主题时,我也会增加count

从这里开始,虽然sequence中的下一个字符等于我们的主题字符串,但我们将位置增加了主题的长度(因此,它位于下一个主题的末尾),并且还增加了{ {1}}。

最后,我们将格式化的字符串(count)附加到输出字符串,并将主题数(等位基因)添加到主(motif)#计数器。

然后,我们将输出作为字典返回(如果需要,可以使用元组)。

alleles

和一个我组成的非常基本的案例的测试:

def dna(tandem_motif, sequence):
    pos = 0
    output = ''
    alleles = 0
    for motif in tandem_motif.split(','):
        if motif[0] == '[' and motif[-1] == ']':
            motif = motif.replace('[', ''). replace(']', '')
            count = 0
            if pos == 0:
                pos = sequence.index(motif) + len(motif)
                count += 1
            while sequence[pos:pos+len(motif)] == motif:
                pos += len(motif)
                count += 1
            output += '({}){}'.format(motif, count)
            alleles += count
        #elif ... :    <-- where you add the criteria for the other motif test cases
    return {'alleles': alleles, 'output': output}

这是正确的,因为:>>> dna('[TCTA]', 'TGCAGCATTCTATCTATCTAGCTAAGCC') {'alleles': 3, 'output': '(TCTA)3'}