Saltar al contenido

Extraer información dentro de todos los paréntesis en R

Queremos proponerte la mejor solución que hallamos on line. Nosotros queremos que te sea útil y si deseas aportar algún detalle que nos pueda ayudar a perfeccionar nuestra información hazlo con libertad.

Solución:

Aquí hay un ejemplo:

> gsub("[\(\)]", "", regmatches(j, gregexpr("\(.*?\)", j))[[1]])
[1] "wonder" "groan"  "Laugh" 

Creo que esto debería funcionar bien:

> regmatches(j, gregexpr("(?=\().*?(?<=\))", j, perl=T))[[1]]
[1] "(wonder)" "(groan)"  "(Laugh)" 

pero los resultados incluyen paréntesis... ¿por qué?

Esto funciona:

regmatches(j, gregexpr("(?<=\().*?(?=\))", j, perl=T))[[1]]

Gracias @MartinMorgan por el comentario.

Usando el paquete stringr podemos reducir esto un poco.

library(stringr)
# Get the parenthesis and what is inside
k <- str_extract_all(j, "\([^()]+\)")[[1]]
# Remove parenthesis
k <- substring(k, 2, nchar(k)-1)

@kohske usa regmatches, pero actualmente estoy usando 2.13, así que no tengo acceso a esa función en este momento. Esto agrega la dependencia de stringr, pero creo que es un poco más fácil trabajar con él y el código es un poco más claro (bueno... tan claro como puede ser usar expresiones regulares...)

Editar: también podríamos intentar algo como esto:

re <- "\(([^()]+)\)"
gsub(re, "\1", str_extract_all(j, re)[[1]])

Este funciona definiendo una subexpresión marcada dentro de la expresión regular. Extrae todo lo que coincida con la expresión regular y luego gsub extrae solo la parte dentro de la subexpresión.

Creo que básicamente hay tres formas fáciles de extraer múltiples grupos de captura en R (sin usar sustitución); str_match_all, str_extract_ally regmatches/gregexpr combinación

Me gusta la expresión regular de @kohske, que busca un paréntesis abierto detrás ?<=\(busca un paréntesis de cierre ?=\)y agarra todo en el medio (perezosamente) .+?en otras palabras (?<=\().+?(?=\))

Usando la misma expresión regular:

str_match_all devuelve la respuesta como matriz.

str_match_all(j, "(?<=\().+?(?=\))")

     [,1]    
[1,] "wonder"
[2,] "groan" 
[3,] "Laugh" 

# Subset the matrix like this....

str_match_all(j, "(?<=\().+?(?=\))")[[1]][,1]
[1] "wonder" "groan"  "Laugh" 

str_extract_all devuelve la respuesta como lista.

str_extract_all(j,  "(?<=\().+?(?=\))")
[[1]]
[1] "wonder" "groan"  "Laugh" 

#Subset the list...
str_extract_all(j,  "(?<=\().+?(?=\))")[[1]]
[1] "wonder" "groan"  "Laugh" 

regmatches/gregexpr también devuelve la respuesta como lista. Dado que esta es una opción base R, algunas personas la prefieren. Tenga en cuenta lo recomendado perl = TRUE.

regmatches(j, gregexpr( "(?<=\().+?(?=\))", j, perl = T))
[[1]]
[1] "wonder" "groan"  "Laugh" 

#Subset the list...
regmatches(j, gregexpr( "(?<=\().+?(?=\))", j, perl = T))[[1]]
[1] "wonder" "groan"  "Laugh" 

Con suerte, la comunidad SO corregirá/editará esta respuesta si he caracterizado incorrectamente las opciones más populares.

Reseñas y valoraciones del artículo

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *