我有这个字符串:
mRNA = "gcgagcgagcaugacgcauguactugacaugguuuaaggccgauuagugaaugugcagacgcgcauaguggcgagcuaaaaacat"
我希望从这个给定的序列中提取子序列。子序列应以aug
开头,并以uaa
,uag
或uga
结尾。
当我将以下正则表达式与gsub!
结合使用时:
mRNA.gsub!(/(aug.*uaa)|(aug.*uag)|(aug.*uga)/, &:upcase)
导致
gcgagcgagcAUGACGCAUGUACTUGACAUGGUUUAAGGCCGAUUAGUGAAUGUGCAGACGCGCAUAGUGGCGAGCUAAaaacat
我不明白为什么它会提升一个整体块而不是像我这样给出两个子序列:
gcgagcgagcAUGACGCAUGUACTUGACAUGGUUUAAggccgauuagugaAUGUGCAGACGCGCAUAGuggcgagcuaaaaacat
我可以用什么正则表达式来实现这个目标?
答案 0 :(得分:2)
.*
运算符被称为"贪婪,"这意味着它会尽可能多地抓取字符,同时仍然匹配模式。
要抓住尽可能少的字符数,请使用"非贪婪的"运算符.*?
。
修改原始正则表达式:
mRNA.gsub!(/(aug.*?uaa)|(aug.*?uag)|(aug.*?uga)/, &:upcase)
但是,有一些较小的正则表达式可以完成这项任务。使用@ stribizhev的建议:
mRNA.gsub!(/aug.*?(?:uaa|uag|uga)/, &:upcase)