Ruby 具有指定开始和结束的序列的正则表达式
Ruby regular expression for sequence with specified start and end
我有这个字符串:
mRNA = "gcgagcgagcaugacgcauguactugacaugguuuaaggccgauuagugaaugugcagacgcgcauaguggcgagcuaaaaacat"
我想将给定序列中的子序列大写。子序列应以 aug
开头,并应以 uaa
、uag
或 uga
结尾。
当我将以下正则表达式与 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)
我有这个字符串:
mRNA = "gcgagcgagcaugacgcauguactugacaugguuuaaggccgauuagugaaugugcagacgcgcauaguggcgagcuaaaaacat"
我想将给定序列中的子序列大写。子序列应以 aug
开头,并应以 uaa
、uag
或 uga
结尾。
当我将以下正则表达式与 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)