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

Ruby regular expression for sequence with specified start and end

我有这个字符串:

mRNA = "gcgagcgagcaugacgcauguactugacaugguuuaaggccgauuagugaaugugcagacgcgcauaguggcgagcuaaaaacat"

我想将给定序列中的子序列大写。子序列应以 aug 开头,并应以 uaauaguga 结尾。 当我将以下正则表达式与 gsub! 结合使用时:

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

结果是

gcgagcgagcAUGACGCAUGUACTUGACAUGGUUUAAGGCCGAUUAGUGAAUGUGCAGACGCGCAUAGUGGCGAGCUAAaaacat

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

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

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

要获取尽可能少的字符数,请使用 "non-greedy" 运算符,.*?

修改您的原始正则表达式:

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

不过,肯定有更小的正则表达式可以完成这项工作。使用@stribizhev 的建议:

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