改变条件后提取子字符串

问题描述 投票:0回答:1

这是我在这个网站上的第一篇文章。我目前正在努力根据不同的条件从多个字符串中提取子字符串。我正在处理的字符串来自 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 substring stringr
1个回答
0
投票
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)]"

正则表达式:

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

这有效地删除了找到的last管道符号以及紧随其后的任何空格(如果有)。

sub
gsub
的不同之处在于
sub
只进行一次这样的替换并退出,在这种情况下,这就是我们所需要的。

替代方案(虽然不是我的首选):也可以使用

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
之间的空格。

© www.soinside.com 2019 - 2024. All rights reserved.