2017-07-07 73 views
0

这里是从我的数据的一些例子:删除第二个“|”在最后一个位置

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|") 

对于一个:个人字符串可以包含更多的条目“SP |”和“ORF”

结果却是这样的:

[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" 

所以,目的是删除最后一个“|”对于每个“sp |”和“orf |”条目。看来“|”是一个特殊的挑战,因为它是正则表达式中的元字符。此外,“orf |”的长度和组成条目差异很大。他们唯一的共同点是“orf |”或“sp |”在开始和那个“|”处于最后位置。我使用gsub()尝试了不同的东西,但也使用了stringr包或regexpr()或[:punct:],但没有任何效果。也许这只是错误的组合。

回答

1

我们可以使用gsub以匹配后跟,或者是在字符串的结尾($)的|和空白(""

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 substr , and paste the list` elements together

sapply(strsplit(a, ","), function(x) paste(substr(x, 1, nchar(x)-1), collapse=",")) 
+1

非常感谢您的帮助。你的建议非常完美。我最好继续增加关于正则表达式的知识以及如何使用它们。:-) – AlRa

0

一个简单的替代方案可能有效。您需要使用“\\|”转义“|”。

# 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寻找,|并替换为,

0

您不必如果指定perl=TRUE在这里使用一个PCRE正则表达式,因为所有你需要可以用默认TRE正则表达式(来完成,图案编译一个PCRE正则表达式引擎和有时比TRE默认的正则表达式引擎慢)。

这里是一个简单的通话gsub

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

online R demo。正如你所看到的那样,没有什么看法是必要的。

图案的详细资料

  • \\| - 文字|符号(因为如果你不逃避,或放入括号表达式会表示交替操作,请参阅下面的线)
  • (,|$) - 一个捕获组(与替换模式中的\1引用)匹配两个备选方案中的任意一个:
    • , - 逗号
    • | - 或(交替操作者)
    • $ - 串锚的端部。

在替换字符串的\1告诉正则表达式引擎插入存储在捕获组#1返回到生成的字符串的内容(因此,逗号恢复这样在必要时)。

相关问题