ruby - 从大字符串创建具有已知起点和终点的子字符串数组
问题描述
我有一个大字符串(字符串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()
我想我需要一个循环来获取子字符串的完整列表
再次感谢答案很有帮助,我很高兴有机会学习。
解决方案
更新后,我认为这就是您要寻找的:
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
我在这个在线编译器上试过了,但它只发现了一个大蛋白质,对吗?但我认为逻辑或多或少是这样的,或者至少是接近的。
推荐阅读
- ruby-on-rails - 我如何在团队、用户和组织之间关联我的模型?
- java - Eclipse Oxygen 未安装软件
- r - 根据组在数据框之间复制和相乘
- sql - 如何使用 Microsoft SQL Server Management Studio 执行 INSERT、SELECT、JOIN 和 CAST 查询?
- python - 我如何知道页面布局中的页数(kivy,python)
- winapi - 来自 windows.h 的 GetAsyncKeyState
- java - 图像和文本的自定义列表视图,或仅文本
- python - 从另一个函数使用时未定义的变量
- javascript - d3js v5 + Topojson v3 关于加入 csv & json 的优化
- java - 在 Java 中使用 Waffle 获取 Kerberos 服务票证