En R, ¿es posible extraer la captura de grupo de una coincidencia de expresión regular? Por lo que yo puedo decir, ninguno de grep, grepl, regexpr, gregexpr, sub, o gsubdevolver las capturas de grupo.
Necesito extraer pares clave-valor de cadenas que están codificadas así:
\((.*?) :: (0\.[0-9]+)\)
Siempre puedo hacer varios greps de coincidencia completa, o hacer algún procesamiento externo (no R), pero esperaba poder hacerlo todo dentro de R. ¿Hay una función o un paquete que proporcione tal función para hacer esto?
regex
r
capture
capture-group
Daniel Dickison
fuente
fuente

str_match_all()para hacer coincidir todos los grupos en una expresión regular[,1]es la coincidencia completa.[,2:3]son los grupos capturados.gsub hace esto, de su ejemplo:
necesita doble escape de las \ s en las comillas, entonces funcionan para la expresión regular.
Espero que esto ayude.
fuente
gsubmanual de R necesita urgentemente un ejemplo que muestre que necesita '\\ 1' para escapar de una referencia de grupo de captura.Prueba
regmatches()yregexec():fuente
regmatchesque nunca había visto antesregexecdevuelve una lista que contiene información sobre solo la ubicación de las coincidencias, por lo queregmatchesrequiere que el usuario proporcione la cadena a la que pertenecía la lista de coincidencias.gsub () puede hacer esto y devolver solo el grupo de captura:
Sin embargo, para que esto funcione, debe seleccionar explícitamente elementos fuera de su grupo de captura como se menciona en la ayuda de gsub ().
Entonces, si el texto que desea seleccionar se encuentra en el medio de alguna cadena, agregar. * Antes y después del grupo de captura debería permitirle devolverlo.
gsub(".*\\((.*?) :: (0\\.[0-9]+)\\).*","\\1 \\2", "(sometext :: 0.1231313213)") [1] "sometext 0.1231313213"fuente
Me gustan las expresiones regulares compatibles con Perl. Probablemente alguien más lo haga también ...
Aquí hay una función que hace expresiones regulares compatibles con Perl y coincide con la funcionalidad de funciones en otros lenguajes a los que estoy acostumbrado:
fuente
Así es como terminé resolviendo este problema. Usé dos expresiones regulares separadas para hacer coincidir el primer y segundo grupo de captura y ejecutar dos
gregexprllamadas, luego extraje las subcadenas coincidentes:fuente
expr "xyx0.0023xyxy" : '[^0-9]*\([.0-9]\+\)'Solución con
strcapturedeutils:fuente
Como se sugiere en el
stringrpaquete, esto se puede lograr usandostr_match()ostr_extract().Adaptado del manual:
Extrayendo y combinando nuestros grupos:
Indicando grupos con una matriz de salida (estamos interesados en las columnas 2+):
fuente
_allsufijo para lasstringrfunciones relevantes .Esto se puede hacer usando el paquete unglue , tomando el ejemplo de la respuesta seleccionada:
O partiendo de un marco de datos
puede obtener la expresión regular sin procesar del patrón unglue, opcionalmente con captura con nombre:
Más información: https://github.com/moodymudskipper/unglue/blob/master/README.md
fuente