2010-09-10 17 views
7

當給定一行字母A,C,G或T的所有字符串時,如ATGCTCTCTTGATTTTTTTATGTGTAGCCATGCACACACACACATAAGA,我被分配了一個問題來查找基因。基因從ATG開始,以TAA,TAG或TGA結束(該基因不包括兩個端點)。該基因由三個字母組成,所以它的長度是三的倍數,並且這些三元組都不能是上面列出的開始/結束三元組。所以,對於上面的基因字符串是CTCTCT和CACACACACACA。事實上,我的正則表達式適用於特定的字符串。這裏是我到目前爲止(和我很高興自己,我能走到今天):Java正則表達式用於基因組拼圖

(?<=ATG)(([ACGT]{3}(?<!ATG))+?)(?=TAG|TAA|TGA) 

但是,如果有另一個結果內的ATG和最終三重,而不是與三胞胎對齊的結果,它失敗了。例如:

Results for TCGAATGTTGCTTATTGTTTTGAATGGGGTAGGATGACCTGCTAATTGGGGGGGGGG : 
TTGCTTATTGTTTTGAATGGGGTAGGA 
ACCTGC 

應該也找到了GGG但不會:TTGCTTATTGTTTTGA(ATG | GGG | TAG)GA

我新的一般和一點點陷進去正則表達式...只是有一點提示會很棒!

+0

什麼都要碰巧'ATGATGTAG'?是否匹配? – 2010-09-10 13:22:40

+0

+1 - 我現在沒有時間思考這個問題,我不知道這是否適合使用正則表達式,但我喜歡你將它應用於生物學中一個有趣的問題。好東西。 – duffymo 2010-09-10 13:23:21

+0

'ATGATGTAG'不匹配,因爲ATG不能是包含的三元組之一。 – Swordbeard 2010-09-10 13:29:56

回答

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 
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) 

您可能還需要考慮使用不同的方法,不涉及正則表達式作爲上述正則表達式會緩慢。

2

像這樣的事情的問題是,你可以慢慢地建立一個正則表達式,通過規則規則,直到你有一些工作。

然後你的需求就會改變,你必須重新開始,因爲它幾乎不可能讓凡人輕易地對一個複雜的正則表達式進行逆向工程。

就個人而言,我寧願這樣做'老式'的方式 - 使用字符串操縱。每個階段都可以輕鬆評論,如果需求略有變化,您可以調整特定階段。

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

+0

其實這是一個教科書問題,它告訴我排除ATG。此外,這個問題不需要正則表達式,你的解決方案是我應該做的,但我認爲正則表達式將是一個有趣的挑戰。 – Swordbeard 2010-09-10 13:52:43