Заменить совпавшую строку ее подгруппами - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть несколько последовательностей ДНК для обработки, они выглядят так:

>KU508975.1 Acalypha australis maturase K (matK) gene, partial cds; chloroplast
TAAATTATGTGTCAGAGCTATTAATACCTTACCCCATCCATCTAGAAAAATGGGTTCAAATTCTTCGATA
TTGGCTGAAAGATCCCTCTTCTTTGCATTTATTACGACTCTTTCTTCATGAATATTGGAATTGGAACTGT
TTTCTTATTCCAAAGAAATCGATTGCTATTTTTACAAAAAGTAATCCAAGATTTTTCTTGTTTCTATATA

>KC747175.1 Achyranthes bidentata bio-material USDA:GRIN:PI613015 maturase K (matK) gene, partial cds; chloroplast
GATATATTAATACCTTACCCCGCTCATCTAGAAATCTTGGTTCAAACTCTCCGATACTGGTTGAAAGATG
CTTCTTCTTTGCATTTATTACGATTCTTTCTTTATGAGTGTCGTAATTGGATTAGTCTTATTACTCCAAA
AAAATCCATTTCCTTTTTGAAAAAAAGGAATCGAAGATTATTCTTGTTCCTATATAATTTCTATGTATGT

Я кодировал регулярное выражение для определения строки заголовка каждой последовательности:

(\>)([A-Z]{2}\d{6}\.?\d)\s([a-zA-Z]+\-?[a-zA-Z]+)\s([a-zA-Z]+\-?[a-zA-Z]+)\s(.*)\n

enter image description here

enter image description here

Какую функцию использовать для заменывесь этот матч с его group3 + group4?Кроме того, у меня 72 совпадения в одном текстовом файле, как я могу заменить их за один прогон?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Ваше текущее регулярное выражение не будет работать для строк, где Группа 3 или 4 содержит одно буквенное слово, потому что [a-zA-Z]+\\-?[a-zA-Z]+ соответствует 1+ буквам, затем необязательному дефису, а затем снова 1+ буквам (это означает, что должно быть в минимум 2 буквы). С [a-zA-Z]+(?:-[a-zA-Z]+)? вы можете сопоставить 1+ букв, за которыми следует необязательная последовательность -, а затем 1+ букв.

Кроме того, \s также соответствует разрывам строк, и если строки заголовка короче, чем вы предполагаете, тогда .* может по ошибке захватить строку последовательности. Вместо этого вы можете использовать \h или [ \t].

Обратите внимание, что \n не требуется в конце шаблона, поскольку .* сопоставляет любые 0+ символов, кроме символов разрыва строки, с библиотекой регулярных выражений ICU (она используется в вашем текущем коде, str_replace_all).

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

Если вы добавите (?m)^ в начале, убедитесь, что вы соответствуете только > в начале строки.

Вы можете использовать

"(?m)^>[A-Z]{2}\\d{6}\\.?\\d\\h+([a-zA-Z]+(?:-[a-zA-Z]+)?)\\h+([a-zA-Z]+(?:-[a-zA-Z]+)?).*"

См. Демонстрационную версию regex .

Код:

Sequence <- str_replace_all(SequenceRaw, 
    "(?m)^>[A-Z]{2}\\d{6}\\.?\\d\\h+([a-zA-Z]+(?:-[a-zA-Z]+)?)\\h+([a-zA-Z]+(?:-[a-zA-Z]+)?).*", 
    "\\1 \\2")
0 голосов
/ 12 сентября 2018

Я понял это сам с пакетами tidyverse:

library(tidyverse)

SequenceRaw <- read_file("PATH OF SEQUENCE FILE\\sequenceraw.fasta") ## e.g. sequenceraw.fasta

Sequence <- str_replace_all(SequenceRaw, 
    "(\\>)([A-Z]{2}\\d{6}\\.?\\d)\\s([a-zA-Z]+\\-?[a-zA-Z]+)\\s([a-zA-Z]+\\-?[a-zA-Z]+)\\s(.*)\\n", 
    ">\\3 \\4\n") ## Keep '>' and add a new line with '\n'

write_file(Sequence, "YOUR PATH\\sequence.fasta")

Вот результат:

enter image description here

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