我希望从一个序列中提取出所有的蛋氨酸残基。
按以下顺序排列:
MFEIEEHMKDSQVEYIIGLHNIPLLNATISVKCTGFQRTMNMQGCANKFMQRHYENPLTG原氨基酸序列:
atgtttgaaatcgaagaacatatgaaggattcacaggtggaatacataattggccttcataatatcccattattgaatgcaactatttcagtgaagtgcacaggatttcaaagaactatgaatatgcaaggttgtgctaataaatttatgcaaagacattatgagaatcccctgacgggg我想从序列中提取出任何M个残基到末尾,并得到以下内容:
- MFEIEEHMKDSQVEYIIGLHNIPLLNATISVKCTGFQRTMNMQGCANKFMQRHYENPLTG
- MKDSQVEYIIGLHNIPLLNATISVKCTGFQRTMNMQGCANKFMQRHYENPLTG
- MNMQGCANKFMQRHYENPLTG
- MQGCANKFMQRHYENPLTG
- MQRHYENPLTG根据我正在处理的数据,在序列中有更多的"M“残基。
我目前拥有的脚本如下。这个脚本首先翻译基因组数据,然后处理氨基酸序列。这做了前两个提取,但没有进一步。
在第二次扫描之后,我尝试重复相同的扫描方法(请参阅下面脚本中的注释部分),但这只是给出了一个错误:
private method scan called for #<Array:0x7f80884c84b0> No Method Error我知道我需要做一个循环,并且已经尝试过,但是都是徒劳的。我也尝试过匹配,但我没有做到-我认为你不能匹配重叠字符,一个单一的匹配方法,但再次,我只是一个初学者.
下面是我使用的脚本:
#!/usr/bin/env ruby
require "bio"
def extract_open_reading_frames(input)
file_output = File.new("./output.aa", "w")
input.each_entry do |entry|
i = 1
entry.naseq.translate(1).scan(/M\w*/i) do |orf1|
file_output.puts ">#{entry.definition.to_s} 5\'3\' frame 1:#{i}\n#{orf1}"
i = i + 1
orf1.scan(/.(M\w*)/i) do |orf2|
file_output.puts ">#{entry.definition.to_s} 5\'3\' frame 1:#{i}\n#{orf2}"
i = i + 1
# orf2.scan(/.(M\w*)/i) do |orf3|
# file_output.puts ">#{entry.definition.to_s} 5\'3\' frame 1:#{i}\n#{orf3}"
# i = i + 1
# end
end
end
end
file_output.close
end
biofastafile = Bio::FlatFile.new(Bio::FastaFormat, ARGF)
extract_open_reading_frames(biofastafile)脚本必须在Ruby中,因为这是Ruby中更长的脚本的一部分。
发布于 2013-08-23 00:24:56
str = "MFEIEEHMKDSQVEYIIGLHNIPLLNATISVKCTGFQRTMNMQGCANKFMQRHYENPLTG"
pos = 0
while pos < str.size
if md = str.match(/M.*/, pos)
puts md[0]
pos = md.offset(0)[0] + 1
else
break
end
end
--output:--
MFEIEEHMKDSQVEYIIGLHNIPLLNATISVKCTGFQRTMNMQGCANKFMQRHYENPLTG
MKDSQVEYIIGLHNIPLLNATISVKCTGFQRTMNMQGCANKFMQRHYENPLTG
MNMQGCANKFMQRHYENPLTG
MQGCANKFMQRHYENPLTG
MQRHYENPLTGmd --代表MatchData对象。match() --如果没有匹配,则返回零,第二个参数是搜索的起始位置。md[0] --是整个比赛(md[1]将是第一个括号组,等等)。md.offset(n) --返回一个数组,其中包含md[n]字符串中的起始位置和结束位置。
在字符串"MMMM“上运行程序将产生输出:
MMMM
MMM
MM
M我也尝试过匹配,但我没有做到-我认为你不能匹配重叠字符,一个单一的匹配方法,但再次,我只是一个初学者.
是的,那是真的。String#scan将不会找到重叠匹配。在scan找到匹配后,搜索将从匹配的末尾开始。Perl有一些方法来备份regexes,我不知道Ruby是否有这些方法。
编辑:
对于Ruby 1.8.7:
str = "MFEIEEHMKDSQVEYIIGLHNIPLLNATISVKCTGFQRTMNMQGCANKFMQRHYENPLTG"
pos = 0
while true
str = str[pos..-1]
if md = str.match(/M.*/)
puts md[0]
pos = md.offset(0)[0] + 1
else
break
end
end发布于 2013-08-23 00:57:41
你可以:
str = "MFEIEEHMKDSQVEYIIGLHNIPLLNATISVKCTGFQRTMNMQGCANKFMQRHYENPLTG"
str.scan(/(?=(M.*))./).flatten
#=> ["MFEIEEHMKDSQVEYIIGLHNIPLLNATISVKCTGFQRTMNMQGCANKFMQRHYENPLTG", MKDSQVEYIIGLHNIPLLNATISVKCTGFQRTMNMQGCANKFMQRHYENPLTG", "MNMQGCANKFMQRHYENPLTG", "MQGCANKFMQRHYENPLTG", "MQRHYENPLTG"]这是通过从M开始,一次前进一个字符来捕获外观。
https://stackoverflow.com/questions/18392471
复制相似问题