2015-08-17 50 views
9

我試圖在R中使用gsub來替換我正在處理的一些字符串中的一些奇怪字符。一切都有效,除了每當我扔進「]」它使整個事情什麼也不做。我正在使用\\,比如gsub("[\\?\\*\\]]", "", name),但它仍然不起作用。這是我的實際例子:如何在R的正則表達式中逸出閉括號「]」

name <- "R U Still Down? [Remember Me]" 

我要的是:names"R U Still Down Remember Me"

當我這樣做: names <- gsub("[\\(\\)\\*\\$\\+\\?'\\[]", "", name) 它半的作品,我也得到"R U Still Down Remember Me]"

但是當我做: names <- gsub("[\\(\\)\\*\\$\\+\\?'\\[\\]]", "", name) 沒有任何反應。 (即我得到"R U Still Down? [Remember Me]"

任何想法?我嘗試切換事物的順序等,但我似乎無法弄清楚。

回答

9

只需啓用perl=TRUE參數。

> gsub("[?\\]\\[*]", "", name, perl=T) 
[1] "R U Still Down Remember Me" 

並且只逃脫需要的字符。

> gsub("[()*$+?'\\[\\]]", "", name, perl=T) 
[1] "R U Still Down Remember Me" 
8

您可以在不轉義的情況下切換字符類的順序。

name <- 'R U Still Down? [Remember Me][*[[]*' 
gsub('[][?*]', '', name) 
# [1] "R U Still Down Remember Me" 

如果你想刪除所有的標點字符,請使用POSIX類[:punct:]

gsub('[[:punct:]]', '', name) 

這個類在ASCII範圍內匹配所有非控制非字母數字非 - 空格個字符。

ascii <- rawToChar(as.raw(0:127), multiple=T) 
paste(ascii[grepl('[[:punct:]]', ascii)], collapse="") 
# [1] "!\"#$%&'()*+,-./:;<=>[email protected][\\]^_`{|}~" 
+2

@MichaelChirico - 當hwnd回答一個正則表達式問題時,我甚至不打擾。他是老闆。 –

+1

謝謝hwnd。我會說,這是資格的老闆。只是另一個問題:我不完全明白'gsub('[] [?*]','',name)'發生了什麼' – seth127

+0

你只介紹解釋爲什麼我不必逃避其他角色?我將在for循環中運行這個不同的名稱,所以我只是想確保我明白底下發生了什麼。 – seth127