Solución:
Aquí hay una opción con anticipación positiva:
gsub(".+_(?=\d+$)", "", X, perl = TRUE)
[1] "3" "23" "91" "16"
Si ese es el patrón que le funciona para 2 dígitos, lo único que tendría que hacer es hacer que uno de los dígitos sea opcional usando ?
L_\d\d?_
Demostración de regex | Demostración de R
Si debe hacer coincidir todo el patrón, puede usar un grupo de captura y usar anclas para afirmar el inicio ^
y el final $
de la cadena y utilice el grupo en el reemplazo.
^L_\d\d?_(\d+)$
En partes
^ Start of string L_ Match L_ d Match a digit d? Match a digit and repeat 0 or 1 times _ Match _ ( Capture group 1 d+ Match a digit and repeat 1 or more times ) Close group $ End of string
Demostración de regex | Demostración de R
X <- c("L_1_3", "L_2_23", "L_3_91", "L_3_16")
gsub("^L_\d\d?_(\d+)$", "\1", X)
Producción
[1] "3" "23" "91" "16"
Aquí hay una expresión regular que lo hace.
Obtiene cualquier cosa hasta que no sea un dígito seguido del grupo de captura de uno o más dígitos al final. Y reemplaza por el grupo de captura.
sub('.*[^[:digit:]]{1}([[:digit:]]+$)', '\1', x)
#[1] "3" "23" "91" "16"
Una expresión regular que funcione para uno y dos dígitos, pero ni más ni menos sería
sub('.*[^[:digit:]]{1}([[:digit:]]{1,2}$)', '\1', x)
#[1] "3" "23" "91" "16"
Datos
x <- scan(what = character(), text="
L_1_3
L_2_23
L_3_91
L_3_16")
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)