将匹配的字符串替换为其子组

时间:2018-09-12 02:04:52

标签: r regex bioinformatics

我要处理一些DNA序列,它们看起来像:

>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?另外,我在一个txt文件中有72个匹配项,如何一次运行即可替换它们?

2 个答案:

答案 0 :(得分:2)

您的当前正则表达式不适用于第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正则表达式库匹配(在当前代码{ {1}}。

通常,您只应使用str_replace_all捕获需要保留的内容,其他所有内容都可以匹配。删除多余的捕获括号,这样可以节省一些性能。

如果在行首添加(...),请确保仅匹配行首的(?m)^

您可以使用

>

请参见regex demo

代码:

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

答案 1 :(得分:1)

我自己用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