2015-08-17 18 views
9

Sto provando a utilizzare gsub in R per sostituire un gruppo di caratteri strani in alcune stringhe che sto elaborando. Tutto funziona, tranne quando lancio "]", non fa nulla. Sto usando \\ come gsub("[\\?\\*\\]]", "", name) ma non funziona ancora. Ecco il mio esempio reale:Come evitare la parentesi chiusa "]" nell'espressione regolare in R

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

quello che voglio è: names di essere "R U Still Down Remember Me"

quando lo faccio: names <- gsub("[\\(\\)\\*\\$\\+\\?'\\[]", "", name) IT semi-opere e ottengo "R U Still Down Remember Me]"

ma quando lo faccio: names <- gsub("[\\(\\)\\*\\$\\+\\?'\\[\\]]", "", name) non succede nulla. (Io ottengo "R U Still Down? [Remember Me]")

Qualche idea? Ho provato a cambiare l'ordine delle cose, ecc. Ma non riesco a capirlo.

risposta

9

Basta abilitare il parametro perl=TRUE.

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

E sfuggire solo i caratteri necessari.

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

È possibile cambiare l'ordine della classe di caratteri senza eseguire l'escape.

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

Se si desidera rimuovere tutti i caratteri di punteggiatura, utilizzare la classe POSIX [:punct:]

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

Questa classe nella gamma ASCII corrisponde a tutti i non controlli, non alfanumerici, non -space caratteri.

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

@MichaelChirico - quando hwnd risponde a una domanda regex, non mi preoccupo nemmeno. È il capo. –

+1

Grazie hwnd. Direi che si qualifica come capo. Solo un'altra domanda: non capisco completamente cosa sta succedendo con 'gsub ('[] [? *]', '', Name)' – seth127

+0

Ti dispiacerebbe solo spiegare perché non devo sfuggire agli altri personaggi? Lo farò in loop su un gruppo di nomi diversi, quindi voglio solo assicurarmi di capire cosa sta succedendo sotto il cofano. – seth127