Elimine toda la puntuación, excepto los apóstrofes en R

Me gustaría utilizar el gsub de R para eliminar toda la puntuación de un texto, excepto los apóstrofos. Soy bastante nuevo en Regex, pero estoy aprendiendo.

Ejemplo:

x <- "I like %$@to*&, chew;: gum, but don't like|}{[] bubble@#^)( gum!?" gsub("[[:punct:]]", "", as.character(x)) 

Salida actual (sin apóstrofes en no)

 [1] "I like to chew gum but dont like bubble gum" 

Salida deseada (deseo que el apóstrofo no se quede)

 [1] "I like to chew gum but don't like bubble gum" 

 x <- "I like %$@to*&, chew;: gum, but don't like|}{[] bubble@#^)( gum!?" gsub("[^[:alnum:][:space:]']", "", x) [1] "I like to chew gum but don't like bubble gum" 

La expresión regular anterior es mucho más directa. Reemplaza todo lo que no sea signos alfanuméricos, espacio o apóstrofo (símbolo de intercalación) con una cadena vacía.

Aquí hay un ejemplo:

 > gsub("(.*?)($|'|[^[:punct:]]+?)(.*?)", "\\2", x) [1] "I like to chew gum but don't like bubble gum" 

Principalmente por variedad, aquí hay una solución usando gsubfn() del fabuloso paquete del mismo nombre. En esta aplicación, me gusta lo bien expresiva que es la solución que permite:

 library(gsubfn) gsubfn(pattern = "[[:punct:]]", engine = "R", replacement = function(x) ifelse(x == "'", "'", ""), x) [1] "I like to chew gum but don't like bubble gum" 

(El argumento engine = "R" es necesario aquí ya que de lo contrario se usará el motor tcl predeterminado. Sus reglas para hacer coincidir expresiones regulares son ligeramente diferentes: si se usara para procesar la cadena anterior, por ejemplo, uno tendría que establecer pattern = "[[:punct:]$|^]" . Gracias a G. Grothendieck por señalar ese detalle.)

Puede excluir apóstrofes del punto de clase POSIX utilizando un doble negativo:

 [^'[:^punct:]] 

Código:

 x <- "I like %$@to*&, chew;: gum, but don't like|}{[] bubble@#^)( gum!?" gsub("[^'[:^punct:]]", "", x, perl=T) #[1] "I like to chew gum but don't like bubble gum" 

demo de ideone