当连续给出一串字母A,C,G或T时,我被分配了一个问题来找到基因,如ATGCTCTCTTGATTTTTTTATGTGTAGCCATGCACACACACATAAGA。基因以ATG开始,以TAA,TAG或TGA结束(该基因不包括两个端点)。该基因由三个字母组成,因此其长度是三的倍数,并且这些三元组中没有一个可以是上面列出的起点/终点三元组。因此,对于其中基因的字符串是CTCTCT和CACACACACACA。事实上,我的正则表达式适用于该特定字符串。这就是我到目前为止所做的事情(我对自己很满意,我得到了这么多):
(?<=ATG)(([ACGT]{3}(?<!ATG))+?)(?=TAG|TAA|TGA)
但是,如果在另一个结果中存在ATG和end-triplet,并且未与该结果的三元组对齐,则会失败。例如:
Results for TCGAATGTTGCTTATTGTTTTGAATGGGGTAGGATGACCTGCTAATTGGGGGGGGGG :
TTGCTTATTGTTTTGAATGGGGTAGGA
ACCTGC
它也应该找到一个GGG但不会:TTGCTTATTGTTTTGA(ATG | GGG | TAG)GA
我一般都是正则表达式的新手,有点卡住......只是一点点暗示会很棒!
答案 0 :(得分:2)
问题是正则表达式会消耗它匹配的字符,然后不再使用它们。
您可以使用零宽度匹配来解决此问题(在这种情况下,您只能获得匹配的索引,而不是匹配的字符)。
或者,您可以使用三个相似的正则表达式,但每个使用不同的偏移量:
(?=(.{3})+$)(?<=ATG)(([ACGT]{3}(?<!ATG))+?)(?=TAG|TAA|TGA)
(?=(.{3})+.$)(?<=ATG)(([ACGT]{3}(?<!ATG))+?)(?=TAG|TAA|TGA)
(?=(.{3})+..$)(?<=ATG)(([ACGT]{3}(?<!ATG))+?)(?=TAG|TAA|TGA)
您可能还想考虑使用不涉及正则表达式的不同方法,因为上述正则表达式会很慢。
答案 1 :(得分:2)
像这样的问题是你可以慢慢建立一个正则规则,按规则统治,直到你有一些工作。
然后你的要求发生变化,你必须重新开始,因为对于凡人而言,几乎不可能轻易地对复杂的正则表达式进行逆向工程。
就个人而言,我宁愿采用'老式'方式 - 使用字符串操作。每个阶段都可以轻松评论,如果要求略有变化,您可以调整特定阶段。
答案 2 :(得分:1)
这是一个可能的正则表达式:
(?=(ATG((?!ATG)[ATGC]{3})*(TAA|TAG|TGA)))
一个小试验台:
public class Main {
public static void main(String[]args) {
String source = "TCGAATGTTGCTTATTGTTTTGAATGGGGTAGGATGACCTGCTAATTGGGGGGGGGGATGATGTAG";
Matcher m = Pattern.compile("(?=(ATG((?!ATG)[ATGC]{3})*(TAA|TAG|TGA)))").matcher(source);
System.out.println("source : "+source+"\nmatches:");
while(m.find()) {
System.out.print(" ");
for(int i = 0; i < m.start(); i++) {
System.out.print(" ");
}
System.out.println(m.group(1));
}
}
}
产生:
source : TCGAATGTTGCTTATTGTTTTGAATGGGGTAGGATGACCTGCTAATTGGGGGGGGGGATGATGTAG
matches:
ATGTTGCTTATTGTTTTGAATGGGGTAGGATGACCTGCTAATTGGGGGGGGGGATGA
ATGGGGTAG
ATGACCTGCTAA
ATGTAG
答案 3 :(得分:0)
也许您应该尝试使用其他方法,例如使用索引。类似的东西:
public static final String genome="ATGCTCTCTTGATTTTTTTATGTGTAGCCATGCACACACACACATAAGA";
public static final String start_codon = "ATG";
public final static String[] end_codons = {"TAA","TAG","TGA"};
public static void main(String[] args) {
List<Integer>start_indexes = new ArrayList<Integer>();
int curIndex = genome.indexOf(start_codon);
while(curIndex!=-1){
start_indexes.add(curIndex);
curIndex = genome.indexOf(start_codon,curIndex+1);
}
}
对其他密码子执行相同操作,并查看索引是否与三元组规则匹配。顺便问一下,你确定一个基因排除了起始密码子吗? (某些ATG可以在基因中找到)