2012-08-24 7 views
9

que busque y sustituya números de 4 dígitos precedido y seguido por un espacio en blanco con:expresión regular a juego todo lo que no es un número de 4 dígitos

str12 <- "coihr 1234 &/()= jngm 34 ljd" 
sub("\\s\\d{4}\\s", "", str12) 
[1] "coihr&/()= jngm 34 ljd" 

pero, cada intento de invertir esto y extraer el número en vez falla. Quiero:

[1] 1234 

hace alguien tiene una pista?

PS: Yo sé cómo hacerlo con {stringr}, pero me pregunto si es posible con {la base} solamente ..

require(stringr) 
gsub("\\s", "", str_extract(str12, "\\s\\d{4}\\s")) 
[1] "1234" 

Respuesta

5

es posible capturar grupo de expresiones regulares usando (). Tomando el mismo ejemplo

str12 <- "coihr 1234 &/()= jngm 34 ljd" 
gsub(".*\\s(\\d{4})\\s.*", "\\1", str12) 
[1] "1234" 
+0

@JoshObrien: acaba de darse cuenta de que obtenemos la misma solución ... – dickoa

+0

Sí. Debemos haber estado escribiendo las mismas líneas al mismo tiempo ... Acabo de eliminar ese primer intento, y publiqué una segunda, mejor, solución que * no * extrae la primera coincidencia. –

+0

¡Gracias, eso ayudó! – Kay

0

estoy bastante ingenuo acerca de expresiones regulares en general, pero aquí es un feo manera de hacerlo en la base:

# if it's always in the same spot as in your example 
unlist(strsplit(str12, split = " "))[2] 

# or if it can occur in various places 
str13 <- unlist(strsplit(str12, split = " ")) 
str13[!is.na(as.integer(str13)) & nchar(str13) == 4] # issues warning 
6

regmatches(), sólo está disponible desde R-2.14.0, le permite "extracto o reemplazar subcadenas coincidentes de los datos de los partidos obtenidos por regexpr, gregexpr o regexec"

Aquí son ejemplos de cómo puede usar regmatches() para extraer primera subcadena de 4 dígitos con espacio en blanco de en su cadena de caracteres de entrada, o todas las subcadenas de.

## Example strings and pattern 
x <- "coihr 1234 &/()= jngm 34 ljd"   # string with 1 matching substring 
xx <- "coihr 1234 &/()= jngm 3444 6789 ljd" # string with >1 matching substring 
pat <- "(?<=\\s)(\\d{4})(?=\\s)" 

## Use regexpr() to extract *1st* matching substring 
as.numeric(regmatches(x, regexpr(pat, x, perl=TRUE))) 
# [1] 1234 
as.numeric(regmatches(xx, regexpr(pat, xx, perl=TRUE))) 
# [1] 1234 


## Use gregexpr() to extract *all* matching substrings 
as.numeric(regmatches(xx, gregexpr(pat, xx, perl=TRUE))[[1]]) 
# [1] 1234 3444 6789 

(Tenga en cuenta que esto devolverá numeric(0) de cadenas de caracteres que no contengan una subcadena que coinciden con su criterio).

+0

@JoshObrien: +1 buen uso de 'regmatches' – dickoa

+0

Ya me he ido con la respuesta de dickoa ... ¡Muchas gracias, sin embargo, por publicar este acercamiento +1! – Kay

+0

Otra opción aquí es usar '\ b \\ d {4} \ b' - también funcionará si el número está al comienzo de la cadena. (Sin embargo, también coincidirá con otros casos, como '" abc (1234) "'). Por supuesto, el OP dijo "precedido y seguido de espacio en blanco", por lo que puede ser inútil ': P' – Kobi

Cuestiones relacionadas