¿Hay una función R para escapar de una cadena para los caracteres regex

Quiero construir una expresión de expresiones regulares que sustituya en algunas cadenas para buscar, por lo que estas cadenas deben escaparse antes de que pueda ponerlas en la expresión regular, de modo que si la cadena buscada contiene caracteres de expresiones regulares, todavía funciona.

Algunos idiomas tienen funciones que harán esto por usted (por ejemplo, python re.escape : https://stackoverflow.com/a/10013356/1900520 ). ¿Tiene R esa función?

Por ejemplo (función inventada):

 x = "foo[bar]" y = escape(x) # y should now be "foo\\[bar\\]" 

He escrito una versión R de la función quotemeta de Perl:

 library(stringr) quotemeta <- function(string) { str_replace_all(string, "(\\W)", "\\\\\\1") } 

Siempre uso el sabor Perl de las expresiones regulares, así que esto funciona para mí. No sé si funciona para las expresiones regulares "normales" en R.

Editar: Encontré la fuente que explica por qué funciona esto. Está en la sección Citas de metacaracteres de la página de manual de perlre :

Esto alguna vez se usó en un idioma común para deshabilitar o citar los significados especiales de metacaracteres de expresiones regulares en una cadena que desea usar para un patrón. Simplemente cite todos los caracteres que no sean "palabras":

 $pattern =~ s/(\W)/\\$1/g; 

Como puede ver, el código R anterior es una traducción directa de esta misma sustitución (después de un viaje a través del infierno de barra invertida). La página de manual también dice (énfasis mío):

A diferencia de otros lenguajes de expresiones regulares , no hay símbolos de barras invertidas que no sean alfanuméricos.

lo que refuerza mi idea de que esta solución solo está garantizada para PCRE.

Aparentemente hay una función llamada escapeRegex en el paquete Hmisc. La función en sí tiene la siguiente definición para un valor de entrada de ‘cadena’:

 gsub("([.|()\\^{}+$*?]|\\[|\\])", "\\\\\\1", string) 

Mi respuesta anterior:

No estoy seguro de si hay una función incorporada, pero podría hacer una para hacer lo que quiera. Básicamente, esto crea un vector de los valores que desea reemplazar y un vector de aquello con lo que desea reemplazarlos y luego pasa por los que realizan los reemplazos necesarios.

 re.escape <- function(strings){ vals <- c("\\\\", "\\[", "\\]", "\\(", "\\)", "\\{", "\\}", "\\^", "\\$","\\*", "\\+", "\\?", "\\.", "\\|") replace.vals <- paste0("\\\\", vals) for(i in seq_along(vals)){ strings <- gsub(vals[i], replace.vals[i], strings) } strings } 

Algunos resultados

 > test.strings <- c("What the $^&(){}.*|?", "foo[bar]") > re.escape(test.strings) [1] "What the \\$\\^&\\(\\)\\{\\}\\.\\*\\|\\?" [2] "foo\\[bar\\]"