首页 > 解决方案 > 从大字符串创建具有已知起点和终点的子字符串数组

问题描述

我有一个大字符串(字符串s),我需要将其分解并提取以开头ATG和结尾的字符串序列。TGA子字符串可以是任意长度,但它们必须存在于字符串中。

s ="CTCGAGACTAGAGCTAGATAAAAAAAATTTTTATTTATTTTTATTTATTTTGAATTAAATAGATTACAAATTAATTAATCCCATCAAATCTTTAAAAAAAAATGGTTTAAAAAAACTTGGGTTGGTTAATTATTATTTGAAAATTTTAAAACCCAAATTAAAAAAAAAAAATGGGATTCAAAAATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTCAGATTGCATAAAAAGATTTTTTTTTTTTTTTTTTCTTATTTCTTAAAACAAATAAATTAAATTAAATAAAAAATAAAAATCAGATCTTCAACTAGTGGTGGTTCAGGAGGTAGTGTGAGTAAAGGTGAAGAAGATAATATGGCATCGTTACCAGCTACACATGAGTTACATATATTCGGTAGCATTAATGGTGTTGATTTTGATATGGTGGGACAAGGTACCGGTAATCCTAATGATGGTTACGAAGAACTAAATTTAAAATCGACTAAAGGTGACTTACAATTTTCTCCATGGATTTTAGTGCCACATATAGGGTATGGTTTTCATCAATACTTACCATATCCAGATGGTATGTCACCATTTCAAGCTGCAATGGTTGATGGATCAGGTTATCAAGTTCATAGAACAATGCAATTTGAAGATGGTGCTTCATTAACTGTTAATTATAGATACACATATGAAGGCTCACATATTAAAGGTGAAGCTCAAGTTAAAGGTACTGGTTTCCCAGCCGATGGCCCAGTTATGACAAATAGTTTAACAGCAGCAGATTGGTGTAGATCCAAAAAAACTTATCCAAATGATAAAACAATTATTTCAACTTTTAAATGGTCATATACAACCGGTAATGGTAAACGTTATCGTTCAACAGCCCGTACAACATATACTTTTGCTAAACCAATGGCAGCTAATTATTTAAAAAATCAACCAATGTATGTTTTTCGTAAAACAGAGTTAAAACATTCAAAAACAGAACTTAATTTTAAAGAATGGCAAAAAGCATTTACAGACGTTATGTAAGCTAGTAGTTAAATAAATAAATTATTTAATAAATAATAAAAAAACAAATTGTTGTAATAATCTAATATTTTCTTTTTTTTTTAATTTTTTTTTTTTAAATCTTAATAATTATTAAGTTATTTTAATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTCTATCAAAAAAATCAAATATATTTAAAAAATTTATTATTTACAGATACATTTTGAATGGTGAAGATAAATATATGCATTAGATGTAAAACAGCCAAAGAGTATGAAAATCAAAAAGATAAAGCTTATCGATTTCGAAAAAGTAAATAGCAATTATTACAAAATTCAATCCGAATCTACCCAAATAAATTCCAATGAAATTGCCGATTTAAAAAAGTTTATTAAAGAAGAAGTCAATAAAACTTCTTCCAAAATTGATTTCTTTTTAGTTTCTTCAACAGATGCCCTTTCAAATCCAGAAAATTATTCTCTCTTAGAAGTAAAGTGTATTAATTGTCATTCTTTGTGTCAAGGAAAAAATTTATATATTTCATGTACAAGAGATGGATGTCAAAACAATATTTGCTATAATTGTTTAGGAATAAACATAAACATATATAATGTTGTTATTAATTCTAAACTTTGCCCTCCATGTTTCAATGATTCGGTAATCAACAAGAAGTGTGCCATGTGTAGTAAGAACGGAACTAAATGTAATTTGAACCAAGAATGTAAACTTCATCTTTGTGCACAGTGTTCTAAAAAGTGTCTATACATTCTGAGAGTCAAAACTAATTAAATAAAATATAAACTTAATTTCTAAATAAACTCATTTAAAAATATTTAAATAATATGAATTTATAACTGTAATTATTGTATTAAAAAATTATATAATTATTTAATGTTAAAAATGTATTAAAATAATTATAAAAAAATATAACAAAAATTTTCGTAAAAATAATTTGTAAAAAAGCTATTAAAAATATTATGAAAAAAAAATTAAAAAAATTATTAAATTGTTTTTGTAATTAAGCTATTAAAATAATTATAAAAAAAAAATTTTTAAAATTTTAAAAATATTTTTTGTAAAAAAGTATTAAAATAATTATGAAAAAAAAATTTTCTAAAAAATTAAAAAAAAAATTAAAATATATTTTATGTTAAAAACGTATTAAAATAACTATTAAAAAAATTATATTTAAAAAAGTATTAACTTTTTTTTAGGTGTGGTTGTGGGGTGGGGTTTAATATATTATAATAAAAAATTATTTTTTGTTCATTTATTATTTTCATTGTATATAATGTACTCAACAACGTTATTATTTTTTCTTTTTTTTTTTATTGTATCAAAATCTTCTGTTCTTCAAAATGATCAGATTGAAGTAAAATATTTTCAACTTCTTATTGTTATGTATCAAAAAGAAAACTGTGTTGAAAAGTCAATGACAGGCGCCGTAATTTATGATGAATGTAATATTCATGGAAGAGTTGAAACAAATAGTACTCATGCGCTTTTTTATGATGACATTGAAACAAATAATTCAAGATGTAACAATTTTCGTAATTTAACAAACTTAATTAAACTTAATGAATGTATTAATGACGAGTTTGGAGAGTCTATTCTTTATAAAGAATATAATGAAACTGATGATGGTTATTTGTTTAGAGTGGAAGACAGCTTTGTTGAAATTACTTCTCTTTCAATGGATTGTACAAAAAATAGTAAAACAATTATTGAAAAATTCAACATTTGTTCAAAATTTGAAAATGTATATCATATTACAAACATTACACAAGAGAAATCCAATAGATTTACATGTACAGATCCATTGTGCCACTATTGTAAGAATGAAAACATTCAAAACAATCTTGATTTTAAAACAACAAAGTGTACTCCAAAGTATGGTGCATCTGATTCTGAATTTTTATCAACAATTTACAATCCAAAGCTCGATGGCTCAAATAACGGTATGGAAAAGTCAGTAACTCAAGAAAAAAACATTTCAAATAATTTAAAAATTAATATATATTTAATTTTCTTTTTAATTATTTTTTTAATTAAATAAAGTTTTATTATTTTTTAAGAGTAATTATTGCTCTTTTTTCATTTGAAACACCAGAAGCTAAACGTAATTGTTGTTGACTGAAATTTTTTATTTTTTTTGGGGTAATAGGATTTCCTTTTTTATGAAGATTAATATCTTTGACTCGTGAAACATTCTTTTTAACTTTTGTTTTTTCTGTTGGTTTATCATTTGTTTTTTCACTAATTTCAATACCATCTTGACGTTCATTCATAACTTCATCTTTTTTTTTTCCTGTTTCTGTATCTTCTTCTATTTTTTTTTCTTTATCTTTTTCTTTATCTTCTTCTTGTTCTTCCTCTTCTTTTTCTTCTTCTGATACTGCAGGTGTTTCTTCTTCTTCTTCTTCCGATATTGTCGGTTTTTCTACTTCTTCTTCTTGTTCTTCTTCTTCTTCTTCTTCTTCTTCTTCTTCTTCTTCTTCTTCTTCTTCTTCCGGTAATTTATTAATTATATTTCTTTTTTTATATGAATTACGTTTGGTTTGTGCAGTAATTTCCTTACATAGAGTGCAGCTTTCAAGAAAAATTTCAATTTCTTCGTTTGTTGCATAATAACCACTGTCTTTGATATGATTAAACATTTTTGATTTTCTTAAATGCTTTCCTTCTTTAATATGAAAATTATCGAATTCTAATTCATTAAGAACAATAAGCTCCCCTAATTTAAAAAATTAGTTAAAATAAATTAAAATGAACATGTATAAAGATGGATTTTACCATTTTTTGAAATTCTAAATAACTTTTCTTCATCTCCAATCTTTTTGACTGAAAAACGATTTTTAATTGAAGTTATTGTTCTGTGAGTGTTTTGAATCGCCCATTTCTCTAAATCAGTTTGAGATAGTGTTTTATAATCTGAATTGTTATACACAACTTTTGCTCTATTAACCAAATATTTAAAGATTTCATCATCAACTGAATATTTTGACTTTACGATTCTTGTCCAAAAAACAATTTCTACTACTATCATTTTTTATTTATAAAATAATTTAAATACAAAAATGAATTTTTTTTTTTTTAAAAAAAAAAAAATTTGAAAAAAAAAAAAAAAAAATTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATCAAATAAAAAGTAAAAAATAAAAACCGAAAAACATTCATTGTAATTTCAAATGTCGAGGCCGGCAGAGGCGGTTTGCGTATTGGGCGCTCTTCCGCTTCCTCGCTCACTGACTCGCTGCGCTCGGTCGTTCGGCTGCGGCGAGCGGTATCAGCTCACTCAAAGGCGGTAATACGGTTATCCACAGAATCAGGGGATAACGCAGGAAAGAACATGTGAGCAAAAGGCCAGCAAAAGGCCAGGAACCGTAAAAAGGCCGCGTTGCTGGCGTTTTTCCATAGGCTCCGCCCCCCTGACGAGCATCACAAAAATCGACGCTCAAGTCAGAGGTGGCGAAACCCGACAGGACTATAAAGATACCAGGCGTTTCCCCCTGGAAGCTCCCTCGTGCGCTCTCCTGTTCCGACCCTGCCGCTTACCGGATACCTGTCCGCCTTTCTCCCTTCGGGAAGCGTGGCGCTTTCTCATAGCTCACGCTGTAGGTATCTCAGTTCGGTGTAGGTCGTTCGCTCCAAGCTGGGCTGTGTGCACGAACCCCCCGTTCAGCCCGACCGCTGCGCCTTATCCGGTAACTATCGTCTTGAGTCCAACCCGGTAAGACACGACTTATCGCCACTGGCAGCAGCCACTGGTAACAGGATTAGCAGAGCGAGGTATGTAGGCGGTGCTACAGAGTTCTTGAAGTGGTGGCCTAACTACGGCTACACTAGAAGGACAGTATTTGGTATCTGCGCTCTGCTGAAGCCAGTTACCTTCGGAAAAAGAGTTGGTAGCTCTTGATCCGGCAAACAAACCACCGCTGGTAGCGGTGGTTTTTTTGTTTGCAAGCAGCAGATTACGCGCAGAAAAAAAGGATCTCAAGAAGATCCTTTGATCTTTTCTACGGGGTCTGACGCTCAGTGGAACGAAAACTCACGTTAAGGGATTTTGGTCATGAGATTATCAAAAAGGATCTTCACCTAGATCCTTTTAAATTAAAAATGAAGTTTTAAATCAATCTAAAGTATATATGAGTAAACTTGGTCTGACAGTTACCAATGCTTAATCAGTGAGGCACCTATCTCAGCGATCTGTCTATTTCGTTCATCCATAGTTGCCTGACTCCCCGTCGTGTAGATAACTACGATACGGGAGGGCTTACCATCTGGCCCCAGTGCTGCAATGATACCGCGAGACCCACGCTCACCGGCTCCAGATTTATCAGCAATAAACCAGCCAGCCGGAAGGGCCGAGCGCAGAAGTGGTCCTGCAACTTTATCCGCCTCCATCCAGTCTATTAATTGTTGCCGGGAAGCTAGAGTAAGTAGTTCGCCAGTTAATAGTTTGCGCAACGTTGTTGCCATTGCTACAGGCATCGTGGTGTCACGCTCGTCGTTTGGTATGGCTTCATTCAGCTCCGGTTCCCAACGATCAAGGCGAGTTACATGATCCCCCATGTTGTGCAAAAAAGCGGTTAGCTCCTTCGGTCCTCCGATCGTTGTCAGAAGTAAGTTGGCCGCAGTGTTATCACTCATGGTTATGGCAGCACTGCATAATTCTCTTACTGTCATGCCATCCGTAAGATGCTTTTCTGTGACTGGTGAGTACTCAACCAAGTCATTCTGAGAATAGTGTATGCGGCGACCGAGTTGCTCTTGCCCGGCGTCAATACGGGATAATACCGCGCCACATAGCAGAACTTTAAAAGTGCTCATCATTGGAAAACGTTCTTCGGGGCGAAAACTCTCAAGGATCTTACCGCTGTTGAGATCCAGTTCGATGTAACCCACTCGTGCACCCAACTGATCTTCAGCATCTTTTACTTTCACCAGCGTTTCTGGGTGAGCAAAAACAGGAAGGCAAAATGCCGCAAAAAAGGGAATAAGGGCGACACGGAAATGTTGAATACTCATACTCTTCCTTTTTCAATATTATTGAAGCATTTATCAGGGTTATTGTCTCATGAGCGGATACATATTTGAATGTATTTAGAAAAATAAACAAATAGGGGTTCCGCGCACATTTCCCCGAAAAGTGCCACCTGACGCGCCCTGTAGCGGGATCCATTTTATTTAATATACTAAATAATAAAAAAGTTAAAAAATGATCATTGGATAAATTTTTTATAATTATAAATAAAGATAATAATTTTTTTTTTAACAAAACTAAAAATAAAAATAATAAAATAATTGTTAAAATAGGTTTTTTTTTTTTTTTTTTTTTTTTAATAAATGGTATTTATTAATTTATTTGTTGTGTGTGTTTTTTTTTTTATAATATTTTTTTTTTTAGCATTGAATTAAGAAGAAATCAAATTGATGCGGCCGCTCAGAAGAACTCGTCAAGAAGGCGATAGAAGGCGATGCGCTGCGAATCGGGAGCGGCGATACCGTAAAGCACGAGGAAGCGGTCAGCCCATTCGCCGCCAAGCTCTTCAGCAATATCACGGGTAGCCAACGCTATGTCCTGATAGCGGTCCGCCACACCCAGCCGTCCACAGTCGATGAATCCAGAAAAGCGGCCATTTTCCACCATGATATTCGGCAAGCAGGCATCGCCATGGGTCACGACGAGATCCTCGCCGTCGGGCATGCGCGCCTTGAGCCTGGCGAACAGTTCGGCTGGCGCGAGCCCCTGATGCTCTTCGTCCAGATCATCCTGATCGACAAGACCGGCTTCCATCCGAGTACGTGCTCGCTCGATGCGATGTTTCGCTTGGTGGTCGAATGGGCAGGTAGCCGGATCAAGCGTATGCAGCCGCCGCATTGCATCAGCCATGATGGATACTTTCTCGGCAGGAGCAAGGTGAGATGACAGGAGATCCTGCCCCGGCACTTCGCCCAATAGCAGCCAGTCCCTTCCCGCTTCAGTGACAACGTCGAGCACAGCTGCGCAAGGAACGCCCGTCGTGGCCAGCCACGATAGCCGCGCTGCCTCGTCCTGCAGTTCATTCAGGGCACCGGACAGGTCGGTCTTGACAAAAAGAACCGGGCGCCCCTGCGCTGACAGCCGGAACACGGCGGCATCAGAGCAGCCGATTGTCTGTTGTGCCCAGTCATAGCCGAATAGCCTCTCCACCCAAGCGGCCGGAGAACCTGCGTGCAATCCATCTTGTTCAATCATGCGAAACGATCCAGCTTGAACATCTTCACCATCCATTTTTTGCTAGCTGTGAAATTAGTTTAAAATACAAATAAAGAGTTATAATAATATACAGTTGAATAAAAAAAAAAAAAATGAATTGGAAAATTTATTTTTATATGAAGAAAAAAAAATTTTGAAAAAAAAAAAAAAATTAAAAAAAAAAAAAAAAAAAAAAAAATTTAAAATTATTCCACTGTGGGGGGCCCCAAATTTTATTTAAAAAAAAAAAAAAAATGGGTCCCTTTTGGGGGGTTGGAAAAAAAAAAAAAAAAAAAAAAAAAAATTGAAAATATAATGTTAGTCATATGATTAATCATT"


所以以这个字符串为例,从这个序列中我需要

ATGGTTTAAAAAAACTTGGGTTGGTTAATTATTATTTGA


所以我想要的子字符串(同样可以是任何长度)将定义开头和结尾,但子字符串的主体是未知的:ATG.....................TGA

我试过使用这段代码,但是它生成的子字符串实际上并不是序列的一部分

def findProteins(dnaString)
  atg = ""
  tga = ""
  between_chars = ""
  sub_string_list = []

  # ATG to TGA
  for i in 0...dnaString.length
    if dnaString[i] == "A" and dnaString[i+1] == "T" and dnaString[i+2] == "G"
      atg = "ATG"
      i = i + 2
    elsif dnaString[i] == "T"  and dnaString[i+1] == "G" and dnaString[i+2] == "A"
      tga = "TGA"
      sub_string_list.append(atg + between_chars + tga)
      atg = ""
      tga = ""
      between_chars = ""
    else

      between_chars += dnaString[i]
      sub_string_list.each do |substring|

        if substring[0..2] != "ATG"
          sub_string_list.delete(substring)

        end # end to each do if block 

      end # end to each do block 

    end # end to if elsif else block

  end # end to for loop
  tta = ""
  tag = ""
  tta_between_chars = ""
  print sub_string_list
  return sub_string_list
end
findProteins(s)

有没有更简洁的方法来获得我想要的东西,也许使用正则表达式?

谢谢!


更新:

我查看了给出的答案,但我意识到我需要的不仅仅是在字符串的任何索引处开始子字符串。相反,我需要子字符串在每 3 个字符之后开始。因为这是您的细胞读取 DNA 的方式,它位于长度为 3 个字符(即密码子)的子字符串中,所以,

CTC GAG ACT AGA GCT AGA TAA AAA AAA TTT TTA TTT ATT TTT ATT TAT TTT GAA TTA AAT AGA TTA CAA ATT AAT TAA TCC CAT CAA ATC TTT AAA

thus with codons and there indices in the string listed we would have 
 CTC:0  GAG:3 ACT:6 AGA:9  TAA:12 AAA:15 TTT:18 TTA:21 etc,etc,etc 

将是理想的格式。话虽如此,我认为我最好的选择是dnaString.scan(/.../)将字符串分解为三个子字符串,将数组拆分为较小的数组,然后将较小的数组连接成一个完整的子字符串。因此,为了保持每个子字符串的索引原点正确,代码的概念看起来有点像

codon_array = dnaString.scan(/.../)

smaller_arrays = codon_array[codon_array.index("ATG")..codon_array.index("TGA" or TAA" or "TAG")]
 
#with the end point of each smaller array being which ever end point (TGA, TAA, TAG) comes first in the index of the array)


substrings = smaller_arrays.join() 


我想我需要一个循环来获取子字符串的完整列表

再次感谢答案很有帮助,我很高兴有机会学习。

标签: ruby

解决方案


更新后,我认为这就是您要寻找的:

def findProteins(dnaString)
  index = 0
  dnaSubStrings = []
  while index < dnaString.length
    dnaSubStrings.push(dnaString[/ATG(?:.{3})*(?:TGA|TAG|TAA)/, index])
    index += 3
  end
  return dnaSubStrings
end

我在这个在线编译器上试过了,但它只发现了一个大蛋白质,对吗?但我认为逻辑或多或少是这样的,或者至少是接近的。


推荐阅读