0

I have a large string (string s), I need to break it up and extract the sequences of the string that starts with ATG and ends with TGA The substrings can be any length but they must exist within the string.

s ="CTCGAGACTAGAGCTAGATAAAAAAAATTTTTATTTATTTTTATTTATTTTGAATTAAATAGATTACAAATTAATTAATCCCATCAAATCTTTAAAAAAAAATGGTTTAAAAAAACTTGGGTTGGTTAATTATTATTTGAAAATTTTAAAACCCAAATTAAAAAAAAAAAATGGGATTCAAAAATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTCAGATTGCATAAAAAGATTTTTTTTTTTTTTTTTTCTTATTTCTTAAAACAAATAAATTAAATTAAATAAAAAATAAAAATCAGATCTTCAACTAGTGGTGGTTCAGGAGGTAGTGTGAGTAAAGGTGAAGAAGATAATATGGCATCGTTACCAGCTACACATGAGTTACATATATTCGGTAGCATTAATGGTGTTGATTTTGATATGGTGGGACAAGGTACCGGTAATCCTAATGATGGTTACGAAGAACTAAATTTAAAATCGACTAAAGGTGACTTACAATTTTCTCCATGGATTTTAGTGCCACATATAGGGTATGGTTTTCATCAATACTTACCATATCCAGATGGTATGTCACCATTTCAAGCTGCAATGGTTGATGGATCAGGTTATCAAGTTCATAGAACAATGCAATTTGAAGATGGTGCTTCATTAACTGTTAATTATAGATACACATATGAAGGCTCACATATTAAAGGTGAAGCTCAAGTTAAAGGTACTGGTTTCCCAGCCGATGGCCCAGTTATGACAAATAGTTTAACAGCAGCAGATTGGTGTAGATCCAAAAAAACTTATCCAAATGATAAAACAATTATTTCAACTTTTAAATGGTCATATACAACCGGTAATGGTAAACGTTATCGTTCAACAGCCCGTACAACATATACTTTTGCTAAACCAATGGCAGCTAATTATTTAAAAAATCAACCAATGTATGTTTTTCGTAAAACAGAGTTAAAACATTCAAAAACAGAACTTAATTTTAAAGAATGGCAAAAAGCATTTACAGACGTTATGTAAGCTAGTAGTTAAATAAATAAATTATTTAATAAATAATAAAAAAACAAATTGTTGTAATAATCTAATATTTTCTTTTTTTTTTAATTTTTTTTTTTTAAATCTTAATAATTATTAAGTTATTTTAATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTCTATCAAAAAAATCAAATATATTTAAAAAATTTATTATTTACAGATACATTTTGAATGGTGAAGATAAATATATGCATTAGATGTAAAACAGCCAAAGAGTATGAAAATCAAAAAGATAAAGCTTATCGATTTCGAAAAAGTAAATAGCAATTATTACAAAATTCAATCCGAATCTACCCAAATAAATTCCAATGAAATTGCCGATTTAAAAAAGTTTATTAAAGAAGAAGTCAATAAAACTTCTTCCAAAATTGATTTCTTTTTAGTTTCTTCAACAGATGCCCTTTCAAATCCAGAAAATTATTCTCTCTTAGAAGTAAAGTGTATTAATTGTCATTCTTTGTGTCAAGGAAAAAATTTATATATTTCATGTACAAGAGATGGATGTCAAAACAATATTTGCTATAATTGTTTAGGAATAAACATAAACATATATAATGTTGTTATTAATTCTAAACTTTGCCCTCCATGTTTCAATGATTCGGTAATCAACAAGAAGTGTGCCATGTGTAGTAAGAACGGAACTAAATGTAATTTGAACCAAGAATGTAAACTTCATCTTTGTGCACAGTGTTCTAAAAAGTGTCTATACATTCTGAGAGTCAAAACTAATTAAATAAAATATAAACTTAATTTCTAAATAAACTCATTTAAAAATATTTAAATAATATGAATTTATAACTGTAATTATTGTATTAAAAAATTATATAATTATTTAATGTTAAAAATGTATTAAAATAATTATAAAAAAATATAACAAAAATTTTCGTAAAAATAATTTGTAAAAAAGCTATTAAAAATATTATGAAAAAAAAATTAAAAAAATTATTAAATTGTTTTTGTAATTAAGCTATTAAAATAATTATAAAAAAAAAATTTTTAAAATTTTAAAAATATTTTTTGTAAAAAAGTATTAAAATAATTATGAAAAAAAAATTTTCTAAAAAATTAAAAAAAAAATTAAAATATATTTTATGTTAAAAACGTATTAAAATAACTATTAAAAAAATTATATTTAAAAAAGTATTAACTTTTTTTTAGGTGTGGTTGTGGGGTGGGGTTTAATATATTATAATAAAAAATTATTTTTTGTTCATTTATTATTTTCATTGTATATAATGTACTCAACAACGTTATTATTTTTTCTTTTTTTTTTTATTGTATCAAAATCTTCTGTTCTTCAAAATGATCAGATTGAAGTAAAATATTTTCAACTTCTTATTGTTATGTATCAAAAAGAAAACTGTGTTGAAAAGTCAATGACAGGCGCCGTAATTTATGATGAATGTAATATTCATGGAAGAGTTGAAACAAATAGTACTCATGCGCTTTTTTATGATGACATTGAAACAAATAATTCAAGATGTAACAATTTTCGTAATTTAACAAACTTAATTAAACTTAATGAATGTATTAATGACGAGTTTGGAGAGTCTATTCTTTATAAAGAATATAATGAAACTGATGATGGTTATTTGTTTAGAGTGGAAGACAGCTTTGTTGAAATTACTTCTCTTTCAATGGATTGTACAAAAAATAGTAAAACAATTATTGAAAAATTCAACATTTGTTCAAAATTTGAAAATGTATATCATATTACAAACATTACACAAGAGAAATCCAATAGATTTACATGTACAGATCCATTGTGCCACTATTGTAAGAATGAAAACATTCAAAACAATCTTGATTTTAAAACAACAAAGTGTACTCCAAAGTATGGTGCATCTGATTCTGAATTTTTATCAACAATTTACAATCCAAAGCTCGATGGCTCAAATAACGGTATGGAAAAGTCAGTAACTCAAGAAAAAAACATTTCAAATAATTTAAAAATTAATATATATTTAATTTTCTTTTTAATTATTTTTTTAATTAAATAAAGTTTTATTATTTTTTAAGAGTAATTATTGCTCTTTTTTCATTTGAAACACCAGAAGCTAAACGTAATTGTTGTTGACTGAAATTTTTTATTTTTTTTGGGGTAATAGGATTTCCTTTTTTATGAAGATTAATATCTTTGACTCGTGAAACATTCTTTTTAACTTTTGTTTTTTCTGTTGGTTTATCATTTGTTTTTTCACTAATTTCAATACCATCTTGACGTTCATTCATAACTTCATCTTTTTTTTTTCCTGTTTCTGTATCTTCTTCTATTTTTTTTTCTTTATCTTTTTCTTTATCTTCTTCTTGTTCTTCCTCTTCTTTTTCTTCTTCTGATACTGCAGGTGTTTCTTCTTCTTCTTCTTCCGATATTGTCGGTTTTTCTACTTCTTCTTCTTGTTCTTCTTCTTCTTCTTCTTCTTCTTCTTCTTCTTCTTCTTCTTCTTCTTCTTCCGGTAATTTATTAATTATATTTCTTTTTTTATATGAATTACGTTTGGTTTGTGCAGTAATTTCCTTACATAGAGTGCAGCTTTCAAGAAAAATTTCAATTTCTTCGTTTGTTGCATAATAACCACTGTCTTTGATATGATTAAACATTTTTGATTTTCTTAAATGCTTTCCTTCTTTAATATGAAAATTATCGAATTCTAATTCATTAAGAACAATAAGCTCCCCTAATTTAAAAAATTAGTTAAAATAAATTAAAATGAACATGTATAAAGATGGATTTTACCATTTTTTGAAATTCTAAATAACTTTTCTTCATCTCCAATCTTTTTGACTGAAAAACGATTTTTAATTGAAGTTATTGTTCTGTGAGTGTTTTGAATCGCCCATTTCTCTAAATCAGTTTGAGATAGTGTTTTATAATCTGAATTGTTATACACAACTTTTGCTCTATTAACCAAATATTTAAAGATTTCATCATCAACTGAATATTTTGACTTTACGATTCTTGTCCAAAAAACAATTTCTACTACTATCATTTTTTATTTATAAAATAATTTAAATACAAAAATGAATTTTTTTTTTTTTAAAAAAAAAAAAATTTGAAAAAAAAAAAAAAAAAATTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATCAAATAAAAAGTAAAAAATAAAAACCGAAAAACATTCATTGTAATTTCAAATGTCGAGGCCGGCAGAGGCGGTTTGCGTATTGGGCGCTCTTCCGCTTCCTCGCTCACTGACTCGCTGCGCTCGGTCGTTCGGCTGCGGCGAGCGGTATCAGCTCACTCAAAGGCGGTAATACGGTTATCCACAGAATCAGGGGATAACGCAGGAAAGAACATGTGAGCAAAAGGCCAGCAAAAGGCCAGGAACCGTAAAAAGGCCGCGTTGCTGGCGTTTTTCCATAGGCTCCGCCCCCCTGACGAGCATCACAAAAATCGACGCTCAAGTCAGAGGTGGCGAAACCCGACAGGACTATAAAGATACCAGGCGTTTCCCCCTGGAAGCTCCCTCGTGCGCTCTCCTGTTCCGACCCTGCCGCTTACCGGATACCTGTCCGCCTTTCTCCCTTCGGGAAGCGTGGCGCTTTCTCATAGCTCACGCTGTAGGTATCTCAGTTCGGTGTAGGTCGTTCGCTCCAAGCTGGGCTGTGTGCACGAACCCCCCGTTCAGCCCGACCGCTGCGCCTTATCCGGTAACTATCGTCTTGAGTCCAACCCGGTAAGACACGACTTATCGCCACTGGCAGCAGCCACTGGTAACAGGATTAGCAGAGCGAGGTATGTAGGCGGTGCTACAGAGTTCTTGAAGTGGTGGCCTAACTACGGCTACACTAGAAGGACAGTATTTGGTATCTGCGCTCTGCTGAAGCCAGTTACCTTCGGAAAAAGAGTTGGTAGCTCTTGATCCGGCAAACAAACCACCGCTGGTAGCGGTGGTTTTTTTGTTTGCAAGCAGCAGATTACGCGCAGAAAAAAAGGATCTCAAGAAGATCCTTTGATCTTTTCTACGGGGTCTGACGCTCAGTGGAACGAAAACTCACGTTAAGGGATTTTGGTCATGAGATTATCAAAAAGGATCTTCACCTAGATCCTTTTAAATTAAAAATGAAGTTTTAAATCAATCTAAAGTATATATGAGTAAACTTGGTCTGACAGTTACCAATGCTTAATCAGTGAGGCACCTATCTCAGCGATCTGTCTATTTCGTTCATCCATAGTTGCCTGACTCCCCGTCGTGTAGATAACTACGATACGGGAGGGCTTACCATCTGGCCCCAGTGCTGCAATGATACCGCGAGACCCACGCTCACCGGCTCCAGATTTATCAGCAATAAACCAGCCAGCCGGAAGGGCCGAGCGCAGAAGTGGTCCTGCAACTTTATCCGCCTCCATCCAGTCTATTAATTGTTGCCGGGAAGCTAGAGTAAGTAGTTCGCCAGTTAATAGTTTGCGCAACGTTGTTGCCATTGCTACAGGCATCGTGGTGTCACGCTCGTCGTTTGGTATGGCTTCATTCAGCTCCGGTTCCCAACGATCAAGGCGAGTTACATGATCCCCCATGTTGTGCAAAAAAGCGGTTAGCTCCTTCGGTCCTCCGATCGTTGTCAGAAGTAAGTTGGCCGCAGTGTTATCACTCATGGTTATGGCAGCACTGCATAATTCTCTTACTGTCATGCCATCCGTAAGATGCTTTTCTGTGACTGGTGAGTACTCAACCAAGTCATTCTGAGAATAGTGTATGCGGCGACCGAGTTGCTCTTGCCCGGCGTCAATACGGGATAATACCGCGCCACATAGCAGAACTTTAAAAGTGCTCATCATTGGAAAACGTTCTTCGGGGCGAAAACTCTCAAGGATCTTACCGCTGTTGAGATCCAGTTCGATGTAACCCACTCGTGCACCCAACTGATCTTCAGCATCTTTTACTTTCACCAGCGTTTCTGGGTGAGCAAAAACAGGAAGGCAAAATGCCGCAAAAAAGGGAATAAGGGCGACACGGAAATGTTGAATACTCATACTCTTCCTTTTTCAATATTATTGAAGCATTTATCAGGGTTATTGTCTCATGAGCGGATACATATTTGAATGTATTTAGAAAAATAAACAAATAGGGGTTCCGCGCACATTTCCCCGAAAAGTGCCACCTGACGCGCCCTGTAGCGGGATCCATTTTATTTAATATACTAAATAATAAAAAAGTTAAAAAATGATCATTGGATAAATTTTTTATAATTATAAATAAAGATAATAATTTTTTTTTTAACAAAACTAAAAATAAAAATAATAAAATAATTGTTAAAATAGGTTTTTTTTTTTTTTTTTTTTTTTTAATAAATGGTATTTATTAATTTATTTGTTGTGTGTGTTTTTTTTTTTATAATATTTTTTTTTTTAGCATTGAATTAAGAAGAAATCAAATTGATGCGGCCGCTCAGAAGAACTCGTCAAGAAGGCGATAGAAGGCGATGCGCTGCGAATCGGGAGCGGCGATACCGTAAAGCACGAGGAAGCGGTCAGCCCATTCGCCGCCAAGCTCTTCAGCAATATCACGGGTAGCCAACGCTATGTCCTGATAGCGGTCCGCCACACCCAGCCGTCCACAGTCGATGAATCCAGAAAAGCGGCCATTTTCCACCATGATATTCGGCAAGCAGGCATCGCCATGGGTCACGACGAGATCCTCGCCGTCGGGCATGCGCGCCTTGAGCCTGGCGAACAGTTCGGCTGGCGCGAGCCCCTGATGCTCTTCGTCCAGATCATCCTGATCGACAAGACCGGCTTCCATCCGAGTACGTGCTCGCTCGATGCGATGTTTCGCTTGGTGGTCGAATGGGCAGGTAGCCGGATCAAGCGTATGCAGCCGCCGCATTGCATCAGCCATGATGGATACTTTCTCGGCAGGAGCAAGGTGAGATGACAGGAGATCCTGCCCCGGCACTTCGCCCAATAGCAGCCAGTCCCTTCCCGCTTCAGTGACAACGTCGAGCACAGCTGCGCAAGGAACGCCCGTCGTGGCCAGCCACGATAGCCGCGCTGCCTCGTCCTGCAGTTCATTCAGGGCACCGGACAGGTCGGTCTTGACAAAAAGAACCGGGCGCCCCTGCGCTGACAGCCGGAACACGGCGGCATCAGAGCAGCCGATTGTCTGTTGTGCCCAGTCATAGCCGAATAGCCTCTCCACCCAAGCGGCCGGAGAACCTGCGTGCAATCCATCTTGTTCAATCATGCGAAACGATCCAGCTTGAACATCTTCACCATCCATTTTTTGCTAGCTGTGAAATTAGTTTAAAATACAAATAAAGAGTTATAATAATATACAGTTGAATAAAAAAAAAAAAAATGAATTGGAAAATTTATTTTTATATGAAGAAAAAAAAATTTTGAAAAAAAAAAAAAAATTAAAAAAAAAAAAAAAAAAAAAAAAATTTAAAATTATTCCACTGTGGGGGGCCCCAAATTTTATTTAAAAAAAAAAAAAAAATGGGTCCCTTTTGGGGGGTTGGAAAAAAAAAAAAAAAAAAAAAAAAAAATTGAAAATATAATGTTAGTCATATGATTAATCATT"


So using this string as an example, from this sequence I need

ATGGTTTAAAAAAACTTGGGTTGGTTAATTATTATTTGA


So substrings I want (again they can be of any length) will have the beginning and ends defined but the body of the substring is not known : ATG.....................TGA

I've tried using this code, however the substrings it generates aren't actually part of the sequence

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)

Is there a more concise way to get what I want, maybe using regex?

Thanks!


UPDATE:

I looked at the answers given, but I realize that what I need isn't to just start the substring at any index of the string. Rather, I need the substrings to start at after every 3 characters. Because This is how your cells read DNA is in substrings with length of 3 characters (i.e., a codon) so,

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 

would be the ideal format. With that being said I think my best options is to use dnaString.scan(/.../) to break up the string into substrings of three, split the array into smaller arrays and then joining the smaller arrays into one whole substring. So in order to keep the index origin points for each substring right the concept of the code would look something vaguely like

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


I think I would need a loop to get a complete list of substrings

Thanks again the answers are helpful and I appreciate the opportunity to learn.

3 Answers3

1

The regex you are looking for is:

r = s.scan(/ATG.*?TGA/)

where ? makes the match non-greedy in case there are multiple matches (like here)

Allan Wind
  • 23,068
  • 5
  • 28
  • 38
1

Complementing the above answer and in case there's not a single line way to do it, you could keep on slicing a copy of the string until it is empty, as follows:

def findProteins(dnaString) 
  remainingString = dnaString
  proteinString = ""
  subStringList = []

  while remainingString != ""
    proteinString = remainingString.match(/ATG(.*?)TGA/)
    remainingString = remainingstring.slice(proteinString)
    subStringList.append(proteinString)
  end

  return subStringList
end

But as it says in this answer you can do simply:

def findProteins(dnaString)
  return dnaString.scan(/ATG.*?TGA/)
end

Hope it's what you were looking for or at least helped in some kind of way.

As commented below, if you would want to add more options for the string to end as TGA, TAG, TAA as shown in this link, the answer would be:

def findProteins(dnaString)
  return dnaString.scan(/ATG.*?(?:TGA|TAG|TAA)/)
end

Including the start and ending sentinels in the resulting string.

Andre GolFe
  • 300
  • 5
  • 12
  • This is defintely closer to what – CodeDependency Dec 26 '20 at 05:42
  • I was looking for, is there a way to have multiple endings tested using the same regex? say for example if i had ```dnaString.scan(/ATG.*?[TGA,TAG,TAA]/)``` and the substring would just end on which ever of those endings in the 'array' came first within the substring? – CodeDependency Dec 26 '20 at 05:44
  • Just found what you are looking for. You can replace the regex part as follows: (/ATG(.*?)(?:TGA|TAG|TAA)/) – Andre GolFe Dec 26 '20 at 06:30
  • The (*?) would trim the string beginnings and endings by the way, I just updated the answer above to fit what you added. – Andre GolFe Dec 26 '20 at 06:40
1

After the Update I think this is what you are looking for:

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

I've tried it out on this online compiler, but it only found one big protein, is ti right? But I think the logic is more or less like this or at least is close.

Andre GolFe
  • 300
  • 5
  • 12