Java Regex用于基因组拼图

时间:2010-09-10 13:10:57

标签: java regex

当连续给出一串字母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

我一般都是正则表达式的新手,有点卡住......只是一点点暗示会很棒!

4 个答案:

答案 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可以在基因中找到)