Расщепление нуклеотидных последовательностей в JS с помощью регулярных выражений - PullRequest
4 голосов
/ 16 июня 2010

Я пытаюсь разбить нуклеотидную последовательность на цепочки аминокислот с помощью регулярного выражения.Я должен начинать новую строку при каждом появлении строки «ATG», но я не хочу фактически останавливать первый матч в «ATG».Допустимым вводом является любой порядок строк As, Cs, Gs и Ts.

Например, если задана строка ввода: ATGAACATAGGACATGAGGAGTCA, я должен получить две строки: ATGAACATAGGACATGAGGAGTCA (все это) и ATGAGGAGTCA (первое)матч "АТГ" и далее).Строка, содержащая «ATG» n раз, должна дать n результатов.

Я думал, что выражение / (?: [ACGT] *) (ATG) [ACGT] * / g будет работать, но это не такт.Если это невозможно сделать с помощью регулярного выражения, достаточно просто написать код для него, но я всегда предпочитаю элегантное решение, если оно доступно.

Ответы [ 5 ]

2 голосов
/ 16 июня 2010

Если вы действительно хотите использовать регулярные выражения, попробуйте следующее:

var str = "ATGAACATAGGACATGAGGAGTCA",
    re = /ATG.*/g, match, matches=[];
while ((match = re.exec(str)) !== null) {
    matches.push(match);
    re.lastIndex = match.index + 3;
}

Но будьте осторожны с exec и изменяйте индекс.Вы можете легко сделать его бесконечным циклом.

В противном случае вы можете использовать indexOf для поиска индексов и substr для получения подстрок:

var str = "ATGAACATAGGACATGAGGAGTCA",
    offset=0, match=str, matches=[];
while ((offset = match.indexOf("ATG", offset)) > -1) {
    match = match.substr(offset);
    matches.push(match);
    offset += 3;
}
1 голос
/ 16 июня 2010

Разделить строку перед каждым вхождением ATG просто, просто используйте

result = subject.split(/(?=ATG)/i);

(?=ATG) - это положительное прогнозное утверждение, означающее «Утверждение, что вы можете сопоставить ATG, начиная с текущей позиции в строке».

Это разделит GGGATGTTTATGGGGATGCCC на GGG, ATGTTT, ATGGGG и ATGCCC.

Итак, теперь у вас есть массив (в данном случае четыре) строк. Теперь я пойду и возьму их, откажусь от первого (этот никогда не будет содержать и не будет начинаться с ATG), а затем присоединюсь к строкам №. 2 + ... + n, затем 3 + ... + n и т. Д., Пока вы не исчерпали список.

Конечно, это регулярное выражение не выполняет никакой проверки в отношении того, содержит ли строка только ACGT символов, поскольку соответствует только позициям между символами, так что это должно быть сделано раньше, т.е. е. что входная строка соответствует /^[ACGT]*$/i.

1 голос
/ 16 июня 2010

Я думаю, вы хотите это

var subStrings = inputString.split('ATG');

KISS:)

0 голосов
/ 16 июня 2010

Это не с регулярным выражением, и я не знаю, если это то, что вы считаете "элегантным", но ...

var sequence = 'ATGAACATAGGACATGAGGAGTCA';
var matches = [];
do {
    matches.push('ATG' + (sequence = sequence.slice(sequence.indexOf('ATG') + 3)));
} while (sequence.indexOf('ATG') > 0);

Я не совсем уверен, что это то, что вы ищете. Например, для входной строки ATGabcdefghijATGklmnoATGpqrs это возвращает ATGabcdefghijATGklmnoATGpqrs, ATGklmnoATGpqrs и ATGpqrs.

0 голосов
/ 16 июня 2010

Поскольку вы хотите снимать с каждой «АТГ» до конца, разделение не подходит для вас.Однако вы можете использовать replace и использовать функцию обратного вызова:

var matches = [];
seq.replace(/atg/gi, function(m, pos){ matches.push(seq.substr(pos)); });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...