Tengo lo que es probablemente una pregunta realmente tonta grep
en R. Disculpas, porque parece que debería ser tan fácil. Obviamente me falta algo.R: cómo obtener grep para devolver la coincidencia, en lugar de toda la cadena
Tengo un vector de cadenas, llamémoslo alice
. Algunos de alice
se imprime a continuación:
T.8EFF.SP.OT1.D5.VSVOVA#4
T.8EFF.SP.OT1.D6.LISOVA#1
T.8EFF.SP.OT1.D6.LISOVA#2
T.8EFF.SP.OT1.D6.LISOVA#3
T.8EFF.SP.OT1.D6.VSVOVA#4
T.8EFF.SP.OT1.D8.VSVOVA#3
T.8EFF.SP.OT1.D8.VSVOVA#4
T.8MEM.SP#1
T.8MEM.SP#3
T.8MEM.SP.OT1.D106.VSVOVA#2
T.8MEM.SP.OT1.D45.LISOVA#1
T.8MEM.SP.OT1.D45.LISOVA#3
me gustaría grep que me diera el número después de la D que aparece en algunas de estas cadenas, condicionada a la cadena que contiene "LIS" y una cadena vacía o algo de otra manera.
Tenía la esperanza de que grep me devolviera el valor de un grupo de captura en lugar de toda la cadena. Aquí está mi expresión regular con sabor a R:
pattern <- (?<=\\.D)([0-9]+)(?=.LIS)
nada demasiado complicado. Sin embargo, con el fin de conseguir lo que busco, en vez de utilizar grep(pattern, alice, value = TRUE, perl = TRUE)
que estoy haciendo lo siguiente, que parece malo:
reg.out <- regexpr(
"(?<=\\.D)[0-9]+(?=.LIS)",
alice,
perl=TRUE
)
substr(alice,reg.out,reg.out + attr(reg.out,"match.length")-1)
Mirándolo ahora no parece demasiado feo, pero la cantidad de meterse en la trampa para hacer funcionar esta cosa tan trivial ha sido embarazoso. ¿Alguien tiene alguna sugerencia sobre cómo hacer esto correctamente?
Marcas adicionales para señalarme a una página web que explica la diferencia entre lo que acceda con $
, @
y attr
.
parece que esto ya se ha preguntado y respondido. Disculpas por la repetición! http://stackoverflow.com/questions/2192316/extract-a-regular-expression-match-in-r-version-2-10/2192732#2192732 –