2011-03-07 13 views
31

En R, ¿hay una manera mejor/más simple que la siguiente de encontrar la ubicación del último punto en una cadena?R: Encuentra el último punto en una cadena

x <- "hello.world.123.456" 
g <- gregexpr(".", x, fixed=TRUE) 
loc <- g[[1]] 
loc[length(loc)] # returns 16 

Esto encuentra todos los puntos en la cadena y luego devuelve la última, pero parece bastante torpe. Traté de usar expresiones regulares, pero no llegué muy lejos.

Respuesta

47

¿Esto funciona para usted?

x <- "hello.world.123.456" 
g <- regexpr("\\.[^\\.]*$", x) 
g 
  • \. coincide con un punto
  • [^\.] partidos todo menos un punto
  • * especifica que se puede producir la expresión anterior (todo menos un punto) entre el 0 y el número ilimitado de veces
  • $ marca el final de la cadena.

Tomando todo en conjunto: encuentra un punto que va seguido de cualquier cosa que no sea un punto hasta que termina el hilo. R requiere \ para escapar, por lo tanto, \\ en la expresión anterior. Vea regex101.com para experimentar con regex.

+0

+1 críptico pero corto y directo! –

+1

a '.' coincide con todos los caracteres posibles, para que coincida con un literal '.' tienes que escapar con un '\' y desafortunadamente, necesitas escapar de este '\' con otro '\'. Así que finalmente tu expresión se ve como '\\'. – CousinCocaine

27

¿Qué tal una mejora de sintaxis menor?

Esto funcionará para su ejemplo literal donde el vector de entrada es de longitud 1. Use escapes para obtener un literal "." búsqueda, y revertir el resultado para obtener el último índice como el "primer":

rev(gregexpr("\\.", x)[[1]])[1] 

Una versión vectorizada más adecuada (en el caso x es más largo que 1):

sapply(gregexpr("\\.", x), function(x) rev(x)[1]) 

y otra opción más ordenado para usar la cola en su lugar:

sapply(gregexpr("\\.", x), tail, 1) 
+0

+1 Qué bien, me ganaste. –

+0

sí, vencerme a mí también :) – Vincent

+0

ahora esto está bien ... – aL3xa

4

Alguien envió la siguiente respuesta que me gustó mucho, pero se dio cuenta de que lo ha eliminado:

regexpr("\\.[^\\.]*$", x) 

me gusta porque produce directamente la ubicación deseada, sin tener que buscar a través de los resultados. La expresión regular también es bastante limpia, lo cual es un poco una excepción en lo que respecta a las expresiones regulares :)

+1

sí, ese era yo. Pensé que la solución anterior funcionaba, así que la eliminé. Tal vez no debería haber :) – Vincent

Cuestiones relacionadas