删除第二个" |"在最后一个位置

时间:2017-07-07 09:40:15

标签: r regex string

以下是我的数据中的一些示例:

a <-c("sp|Q9Y6W5|","sp|Q9HB90|,sp|Q9NQL2|","orf|NCBIAAYI_c_1_1023|",
     "orf|NCBIACEN_c_10_906|,orf|NCBIACEO_c_5_1142|", 
      "orf|NCBIAAYI_c_258|,orf|aot172_c_6_302|,orf|aot180_c_2_405|")

对于a:单个字符串可以包含更多的&#34; sp |&#34;和&#34; orf&#34;

结果必须如下:

[1] "sp|Q9Y6W5" "sp|Q9HB90,sp|Q9NQL2" "orf|NCBIAAYI_c_1_1023" 
   "orf|NCBIACEN_c_10_906,orf|NCBIACEO_c_5_1142" 
   "orf|NCBIAAYI_c_258,orf|aot172_c_6_302,orf|aot180_c_2_405"

所以目的是删除最后一个&#34; |&#34;对于每个&#34; sp |&#34;和&#34; orf |&#34;条目。似乎&#34; |&#34;是一个特殊的挑战,因为它是正则表达式中的元字符。此外,&#34; orf |&#34;的长度和组成。条目变化很大。他们唯一的共同点是&#34; orf |&#34;或&#34; sp |&#34;在开头那个&#34; |&#34;是在最后一个位置。我尝试使用gsub()以及stringr包或regexpr()或[:punct:]尝试不同的东西,但没有真正起作用。也许这只是错误的组合。

3 个答案:

答案 0 :(得分:1)

我们可以使用gsub来匹配后跟|的{​​{1}}或匹配字符串的末尾(,)并替换为空白({1}} {1}})

$

或者我们"" gsub("[|](?=(,|$))", "", a, perl = TRUE) #[1] "sp|Q9Y6W5" #[2] "sp|Q9HB90,sp|Q9NQL2" #[3] "orf|NCBIAAYI_c_1_1023" #[4] "orf|NCBIACEN_c_10_906,orf|NCBIACEO_c_5_1142" #[5] "orf|NCBIAAYI_c_258,orf|aot172_c_6_302,orf|aot180_c_2_405" split,', remove the last character with列表'元素粘贴在一起

, and

答案 1 :(得分:0)

可能有效的替代方案。你需要逃避&#34; |&#34;使用&#34; \\|&#34;。

# Input
a <-c("sp|Q9Y6W5|","sp|Q9HB90|,sp|Q9NQL2|","orf|NCBIAAYI_c_1_1023|",
      "orf|NCBIACEN_c_10_906|,orf|NCBIACEO_c_5_1142|", 
      "orf|NCBIAAYI_c_258|,orf|aot172_c_6_302|,orf|aot180_c_2_405|")

# Expected output
b <- c("sp|Q9Y6W5", "sp|Q9HB90,sp|Q9NQL2", "orf|NCBIAAYI_c_1_1023" ,
       "orf|NCBIACEN_c_10_906,orf|NCBIACEO_c_5_1142" ,
       "orf|NCBIAAYI_c_258,orf|aot172_c_6_302,orf|aot180_c_2_405")

res <- gsub("\\|,", ",", gsub("\\|$", "", a))

all(res == b)
#[1] TRUE

您可以构建对gsub的单个正则表达式调用,但这很简单易懂。内部gsub查找|和字符串的结尾并将其删除。外gsub查找,|并替换为,

答案 2 :(得分:0)

您不必在此处使用PCRE正则表达式,因为您可以使用默认的TRE正则表达式完成所有操作(如果指定perl=TRUE,则使用PCRE正则表达式引擎编译模式,有时比TRE慢默认的正则表达式引擎)。

这是一个简单的gsub调用:

gsub("\\|(,|$)", "\\1", a)

请参阅online R demo。正如你所看到的,没有任何外观是必要的。

模式详情

  • \\| - 文字|符号(因为如果你没有将其转义或放入括号表达式,它将表示一个交替运算符,请参阅下面的一行)
  • (,|$) - 一个捕获组(从替换模式引用\1)匹配两个备选方案中的任何一个:
    • , - 逗号
    • | - 或(交替运营商)
    • $ - 字符串锚定结束。

替换字符串中的\1告诉正则表达式引擎将存储在捕获组#1中的内容插回到结果字符串中(因此,逗号将在必要时以这种方式恢复)。