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_all
y 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.