Java Regex для генома - PullRequest
       3

Java Regex для генома

7 голосов
/ 10 сентября 2010

Мне была дана задача найти гены, когда мне дали строку букв A, C, G или T, все подряд, как ATGCTCTCTTGATTTTTTTATGTGTAGCCATGCACACACACACATAAGA. Ген начинается с ATG и заканчивается либо TAA, TAG, либо TGA (ген исключает обе конечные точки). Ген состоит из триплетов букв, поэтому его длина кратна трем, и ни один из этих триплетов не может быть начальным / конечным триплетами, перечисленными выше. Таким образом, для строки выше генов в ней являются CTCTCT и CACACACACACA. И фактически мое регулярное выражение работает для этой конкретной строки. Вот что у меня так далеко (и я очень доволен собой, что так далеко):

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

Однако, если в другом результате есть ATG и конечный триплет, и он не выровнен с триплетами этого результата, произойдет сбой. Например:

Results for TCGAATGTTGCTTATTGTTTTGAATGGGGTAGGATGACCTGCTAATTGGGGGGGGGG :
TTGCTTATTGTTTTGAATGGGGTAGGA
ACCTGC

Должен также найти GGG, но не: TTGCTTATTGTTTTGA (ATG | GGG | TAG) GA

Я новичок в регулярных выражениях в целом и немного застрял ... просто небольшой намек был бы потрясающим!

Ответы [ 4 ]

2 голосов
/ 10 сентября 2010

Проблема с такими вещами заключается в том, что вы можете постепенно создавать регулярное выражение, правило за правилом, пока у вас не будет что-то, что работает.

Тогда ваши требования изменятся, и вам придется начинать все сначала, потому чтодля простых смертных почти невозможно легко перепроектировать сложное регулярное выражение.

Лично я предпочел бы сделать это «старомодным» способом - использовать манипуляции со строками.Каждый этап может быть легко прокомментирован, и если есть небольшие изменения в требованиях, вы можете просто настроить конкретный этап.

2 голосов
/ 10 сентября 2010

Проблема в том, что регулярное выражение использует символы, которые оно соответствует, и затем они не используются снова.

Вы можете решить эту проблему, используя совпадение нулевой ширины (в этом случае вы получаете только индекс совпадения, а не совпадающие символы).

В качестве альтернативы вы можете использовать три одинаковых регулярных выражения, но каждое из них использует свое смещение:

(?=(.{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 голос
/ 10 сентября 2010

Вот возможное регулярное выражение:

(?=(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
0 голосов
/ 10 сентября 2010

Возможно, вам следует попробовать другие методы, такие как работа с индексами. Что-то вроде:

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

сделайте то же самое для других кодонов и посмотрите, соответствуют ли индексы правилу триплета. Кстати, вы уверены, что ген исключает стартовый кодон? (некоторые гены можно найти в гене)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...