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

具有指定开始和结束的序列的Ruby正则表达式,ruby,regex,bioinformatics,sequences,Ruby,Regex,Bioinformatics,Sequences,我有这个字符串: mRNA = "gcgagcgagcaugacgcauguactugacaugguuuaaggccgauuagugaaugugcagacgcgcauaguggcgagcuaaaaacat" 我想将子序列从这个给定序列中提升。子序列应以aug开始,并以uaa、uag或uga结束。 当我将下面的正则表达式与gsub组合使用时: mRNA.gsub!(/(8月*日uaa)|(8月*日uag)|(8月*日uga)/,&:upcase) 结果是 gcgaggagcaugacgcauga

我有这个字符串:

mRNA = "gcgagcgagcaugacgcauguactugacaugguuuaaggccgauuagugaaugugcagacgcgcauaguggcgagcuaaaaacat"
我想将子序列从这个给定序列中提升。子序列应以
aug
开始,并以
uaa
uag
uga
结束。 当我将下面的正则表达式与
gsub组合使用时

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

结果是

gcgaggagcaugacgcaugactugcauggauggauggauggagcauggcagcuaaaacat

我不明白为什么它会升级一整块而不是给我两个子序列,就像这样:
gcgaggagcaugacgcaugactugcauggauggauggauggagcauggcagcuaaaacat


我可以使用什么正则表达式来实现这一点?

这个
*
操作符被称为“贪婪”,这意味着它将在仍然匹配模式的情况下尽可能多地抓取字符

要获取尽可能少的字符数,请使用“非贪婪”运算符,
*?

修改原始正则表达式:

mRNA.gsub!(/(aug.*?uaa)|(aug.*?uag)|(aug.*?uga)/, &:upcase)
不过,肯定有一些较小的正则表达式可以完成这项工作。使用@Stribizev的建议:

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

只需使用
aug.*(?:uaa | uag | uga)
甚至
aug.*(?:u(?:a[ag]| ga))
。你忘记了第二句话中的