gsub("(?<![0-9])0+", "", c("005", "0AB", "000", "0"), perl = TRUE)
#> [1] "5" "AB" "" ""
gsub("(^|[^0-9])0+", "\\1", c("005", "0AB", "000", "0"), perl = TRUE)
#> [1] "5" "AB" "" ""
La expresión regular anterior es de este hilo SO que explica cómo eliminar todos los ceros a la izquierda de una cadena en R. Como consecuencia de esta expresión regular, tanto "000" como "0" se transforman en "". En cambio, quiero eliminar todos los ceros a la izquierda de una cadena de caracteres, excepto en los casos en que el carácter final sea cero o el único carácter sea cero.
"005" would become "5"
"0AB" would become "AB"
"000" would become "0"
"0" would become "0"
Este otro hilo SO explica cómo hacer lo que quiero, pero no creo que esté obteniendo la sintaxis bastante correcta, aplicando la solución en R. Y realmente no entiendo la distinción entre la primera y la segunda solución a continuación ( si de verdad funcionaran).
gsub("s/^0*(\d+)$/$1/;", "", c("005", "0AB", "000", "0"), perl = TRUE) # 1st solution
# Error: '\d' is an unrecognized escape in character string starting ""s/^0*(\d"
gsub("s/0*(\d+)/$1/;", "", c("005", "0AB", "000", "0"), perl = TRUE) # 2nd solution
# Error: '\d' is an unrecognized escape in character string starting ""s/0*(\d"
¿Cuál es la expresión regular adecuada en R para obtener lo que quiero?
regex
novato. ¿Cuál es la diferencia de rendimiento (u otras preferencias) entre su patrón y este^0*(.+)$
o^0+(.+)$
?.
pueden coincidir0
y ambos patrones adyacentes se cuantifican indefinidamente, pero solo un poco.Podemos agregar una condición más con una búsqueda de expresiones regulares para verificar cualquier valor distinto de cero después de uno o más ceros (
0+
)datos
fuente
regex
gurú de ninguna manera, pero las búsquedas no son eficientes, ¿verdad? Dado que tiene dos,sub
es posible que desee eliminar todos los ceros iniciales y reemplazarlos""
con0
?sub("^$", "0", sub("^0+", "", v1), perl = TRUE)
Mediante el uso de un límite sin palabras . Vea esta demostración en regex101 o una demostración R en tio.run .
\B
Esto no coincidirá con el último cero, porque a la derecha no hay caracteres de palabra .
fuente
Puede usar una alternancia para hacer coincidir todos los ceros en la cadena en un grupo de captura o hacer coincidir todos los ceros desde el comienzo de la cadena.
En el reemplazo use el grupo 1.
Regex demo | Demo R
Por ejemplo
Salida
O incluso mejor, como comentó Wiktor Stribiżew , podría usar capturar un solo 0 en un grupo y repetir el grupo en sí para capturar la última instancia de un cero.
Demo de expresiones regulares
fuente
^(0)+$|^0+
sub("^0+(?!$)", "", x, perl=TRUE)
que también funcionaráOtra
regex
opcion:Aquí hay una demostración de expresiones regulares .
Usando
base::sub
en R:He aquí una demostración R .
O expandiendo la respuesta de @akrun :
fuente