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 gsub
devolver 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
gsub
manual de R necesita urgentemente un ejemplo que muestre que necesita '\\ 1' para escapar de una referencia de grupo de captura.Prueba
regmatches()
yregexec()
:fuente
regmatches
que nunca había visto antesregexec
devuelve una lista que contiene información sobre solo la ubicación de las coincidencias, por lo queregmatches
requiere 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
gregexpr
llamadas, luego extraje las subcadenas coincidentes:fuente
expr "xyx0.0023xyxy" : '[^0-9]*\([.0-9]\+\)'
Solución con
strcapture
deutils
:fuente
Como se sugiere en el
stringr
paquete, 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
_all
sufijo para lasstringr
funciones 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