2017-07-07 31 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返回到生成的字符串的內容(因此,逗號恢復這樣在必要時)。

相關問題