改变条件后提取子字符串

Extract substring after varying condition

提问人:netmarson 提问时间:10/26/2023 最后编辑:r2evansnetmarson 更新时间:10/26/2023 访问量:40

问:

这是我在这个网站上的第一篇帖子。我目前正在努力根据不同的条件从多个字符串中提取一个子字符串。我正在处理的字符串来自 FASTA 文件,如下所示:

strings <- c("gi|0|gb|MK004980| Bat astrovirus isolate DXRA19 RNA-dependent RNA polymerase gene, partial cds. [DXRA19 (BVI10455)]",
             "gi|225381010|gb|FJ571114| Bat astrovirus Tm/Guangxi/LD61/2007 RNA-dependent RNA polymerase (pol) gene, partial cds. [Tm/Guangxi/LD61/2007 (BVI03388)]")

我现在的目标是删除字符串的第一部分(带有“X|Y|Z|A|“)并仅提取特定序列的名称,因此它应该如下所示:

strings_final <- c("Bat astrovirus isolate DXRA19 RNA-dependent RNA polymerase gene, partial cds. [DXRA19 (BVI10455)]",
             "Bat astrovirus Tm/Guangxi/LD61/2007 RNA-dependent RNA polymerase (pol) gene, partial cds. [Tm/Guangxi/LD61/2007 (BVI03388)]")

正如你所看到的,要删除的第一个部分在腿上有所不同,唯一一致的部分是四个“|”以及“gi”和“gb”。我知道我可以使用此模式将其删除并仅提取其之后的部分。但是,我目前正在努力在 R 中对此进行编码,因为我不知道使用哪个表达式来适应这种模式,例如 stringr::str_extract() 函数。

我将非常感谢您的帮助。

我尝试使用 stringr::str_extract() 函数,但我不知道我应该放入哪种模式来解决这个问题。

r string 子字符串 stringr

评论


答:

0赞 r2evans 10/26/2023 #1
sub(".*\\| *", "", strings)
# [1] "Bat astrovirus isolate DXRA19 RNA-dependent RNA polymerase gene, partial cds. [DXRA19 (BVI10455)]"                          
# [2] "Bat astrovirus Tm/Guangxi/LD61/2007 RNA-dependent RNA polymerase (pol) gene, partial cds. [Tm/Guangxi/LD61/2007 (BVI03388)]"

正则表达式:

  • .* 任何东西(或什么都没有)
  • \\|文字管道符号,需要转义它,否则它是正则表达式运算符
  • *零个或多个空格

这有效地删除了找到的最后一个管道符号以及紧随其后的任何空格(如果有)。 不同的是,只进行一次这样的替换并退出,在这种情况下,这就是我们所需要的。subgsubsub

替代方案(虽然不是我的首选):也可以假设所有字符串都具有相同数量的 -symbols:read.table|

trimws(read.table(text = strings, sep = "|")[,5])
# [1] "Bat astrovirus isolate DXRA19 RNA-dependent RNA polymerase gene, partial cds. [DXRA19 (BVI10455)]"                          
# [2] "Bat astrovirus Tm/Guangxi/LD61/2007 RNA-dependent RNA polymerase (pol) gene, partial cds. [Tm/Guangxi/LD61/2007 (BVI03388)]"

我们需要删除 和 之间的空格。trimws|Bat