具有指定开始和结束的序列的Ruby正则表达式

时间:2015-12-16 23:26:47

标签: ruby regex bioinformatics sequences

我有这个字符串:

mRNA = "gcgagcgagcaugacgcauguactugacaugguuuaaggccgauuagugaaugugcagacgcgcauaguggcgagcuaaaaacat"

我希望从这个给定的序列中提取子序列。子序列应以aug开头,并以uaauaguga结尾。 当我将以下正则表达式与gsub!结合使用时:

mRNA.gsub!(/(aug.*uaa)|(aug.*uag)|(aug.*uga)/, &:upcase)

导致

gcgagcgagcAUGACGCAUGUACTUGACAUGGUUUAAGGCCGAUUAGUGAAUGUGCAGACGCGCAUAGUGGCGAGCUAAaaacat

我不明白为什么它会提升一个整体块而不是像我这样给出两个子序列: gcgagcgagcAUGACGCAUGUACTUGACAUGGUUUAAggccgauuagugaAUGUGCAGACGCGCAUAGuggcgagcuaaaaacat

我可以用什么正则表达式来实现这个目标?

1 个答案:

答案 0 :(得分:2)

.*运算符被称为"贪婪,"这意味着它会尽可能多地抓取字符,同时仍然匹配模式。

要抓住尽可能少的字符数,请使用"非贪婪的"运算符.*?

修改原始正则表达式:

mRNA.gsub!(/(aug.*?uaa)|(aug.*?uag)|(aug.*?uga)/, &:upcase)
但是,有一些较小的正则表达式可以完成这项任务。使用@ stribizhev的建议:

mRNA.gsub!(/aug.*?(?:uaa|uag|uga)/, &:upcase)