Más de 9 referencias en gsub ()
Pregunta
¿Cómo usar gsub con más de 9 referencias anteriores? Esperaría que la salida en el ejemplo a continuación sea "e, g, i, j, o".
> test <- "abcdefghijklmnop"
> gsub("(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)", "\\5, \\7, \\9, \\10, \\15", test, perl = TRUE)
[1] "e, g, i, a0, a5"
Solución
Ver Expresiones regulares con el lenguaje R :
Puede usar las referencias anteriores
\ 1
a\ 9
en el texto de reemplazo para volver a insertar el texto que coincida con un grupo de captura . No hay token de texto de reemplazo para la coincidencia general. Coloque la expresión regular completa en un grupo de captura y luego use\ 1
.
Pero con PCRE debería poder usar grupos con nombre . Así que intente (?P<
name
>
regex
)
para nombrar groupd y (?P=
name
)
como referencia .
Otros consejos
Utilice strsplit
en su lugar:
test <- "abcdefghijklmnop"
strsplit(test, "")[[1]][c(5, 7, 9, 10, 15)]
Entendí que \ 10 podríamos entender como referencia 0 seguida de un dígito de 1. Creo que 9 es el máximo.
Las funciones stri_replace _ * _ regex
del paquete stringi no tienen tales limitaciones:
library("stringi")
stri_replace_all_regex("abcdefghijkl", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", "$10$1$11$12")
## [1] "jakl"
Si desea seguir al primer grupo de captura con 1, use, por ejemplo,
stri_replace_all_regex("abcdefghijkl", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", "$10$1$1\\1$12")
## [1] "jaa1l"
De acuerdo con este sitio , las referencias anteriores \ 10 a \ 99 funcionan en algunos idiomas, pero no la mayoría.
Los que se informa que trabajan son
Esta limitación a 9 referencias posteriores es específica de las funciones sub ()
y gsub ()
, no a funciones como grep ()
y similares. La compatibilidad con más de 9 referencias posteriores en R implica el uso de la expresión regular PCRE (es decir, el argumento perl = TRUE
); sin embargo, incluso con esta opción, las funciones sub () y gsub () no lo admiten.
La documentación de R es explícita en este punto: vea ?regexp
There can be more than 9 backreferences (but the replacement in sub can
only refer to the first 9).
Además, la idea de usar grupos de captura con nombre para sortear esta limitación está destinada a fallar ya que los grupos de captura con nombre no son compatibles con las funciones sub ().
regexpr and gregexpr support ‘named capture’. If groups are named,
e.g., "(?<first>[A-Z][a-z]+)" then the positions of the matches are also
returned by name. (Named backreferences are not supported by sub.)