我要处理一些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
我应该使用什么功能将整个匹配项替换为其group3 + group4?另外,我在一个txt文件中有72个匹配项,如何一次运行即可替换它们?
答案 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")
结果如下: