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"
¿Fue útil?

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.)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top