首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从蛋白质序列中提取所有可能的蛋氨酸残基?

如何从蛋白质序列中提取所有可能的蛋氨酸残基?
EN

Stack Overflow用户
提问于 2013-08-22 23:40:56
回答 2查看 149关注 0票数 0

我希望从一个序列中提取出所有的蛋氨酸残基。

按以下顺序排列:

代码语言:javascript
复制
MFEIEEHMKDSQVEYIIGLHNIPLLNATISVKCTGFQRTMNMQGCANKFMQRHYENPLTG

原氨基酸序列:

代码语言:javascript
复制
atgtttgaaatcgaagaacatatgaaggattcacaggtggaatacataattggccttcataatatcccattattgaatgcaactatttcagtgaagtgcacaggatttcaaagaactatgaatatgcaaggttgtgctaataaatttatgcaaagacattatgagaatcccctgacgggg

我想从序列中提取出任何M个残基到末尾,并得到以下内容:

代码语言:javascript
复制
- MFEIEEHMKDSQVEYIIGLHNIPLLNATISVKCTGFQRTMNMQGCANKFMQRHYENPLTG
- MKDSQVEYIIGLHNIPLLNATISVKCTGFQRTMNMQGCANKFMQRHYENPLTG
- MNMQGCANKFMQRHYENPLTG
- MQGCANKFMQRHYENPLTG
- MQRHYENPLTG

根据我正在处理的数据,在序列中有更多的"M“残基。

我目前拥有的脚本如下。这个脚本首先翻译基因组数据,然后处理氨基酸序列。这做了前两个提取,但没有进一步。

在第二次扫描之后,我尝试重复相同的扫描方法(请参阅下面脚本中的注释部分),但这只是给出了一个错误:

代码语言:javascript
复制
private method scan called for #<Array:0x7f80884c84b0> No Method Error

我知道我需要做一个循环,并且已经尝试过,但是都是徒劳的。我也尝试过匹配,但我没有做到-我认为你不能匹配重叠字符,一个单一的匹配方法,但再次,我只是一个初学者.

下面是我使用的脚本:

代码语言:javascript
复制
#!/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中更长的脚本的一部分。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-23 00:24:56

代码语言:javascript
复制
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
MQRHYENPLTG

md --代表MatchData对象。match() --如果没有匹配,则返回零,第二个参数是搜索的起始位置。md[0] --是整个比赛(md[1]将是第一个括号组,等等)。md.offset(n) --返回一个数组,其中包含md[n]字符串中的起始位置和结束位置。

在字符串"MMMM“上运行程序将产生输出:

代码语言:javascript
复制
MMMM
MMM
MM
M

我也尝试过匹配,但我没有做到-我认为你不能匹配重叠字符,一个单一的匹配方法,但再次,我只是一个初学者.

是的,那是真的。String#scan将不会找到重叠匹配。在scan找到匹配后,搜索将从匹配的末尾开始。Perl有一些方法来备份regexes,我不知道Ruby是否有这些方法。

编辑:

对于Ruby 1.8.7:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2013-08-23 00:57:41

你可以:

代码语言:javascript
复制
str = "MFEIEEHMKDSQVEYIIGLHNIPLLNATISVKCTGFQRTMNMQGCANKFMQRHYENPLTG"
str.scan(/(?=(M.*))./).flatten
#=> ["MFEIEEHMKDSQVEYIIGLHNIPLLNATISVKCTGFQRTMNMQGCANKFMQRHYENPLTG", MKDSQVEYIIGLHNIPLLNATISVKCTGFQRTMNMQGCANKFMQRHYENPLTG", "MNMQGCANKFMQRHYENPLTG", "MQGCANKFMQRHYENPLTG", "MQRHYENPLTG"]

这是通过从M开始,一次前进一个字符来捕获外观。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18392471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档