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" "" ""
L'expression régulière ci - dessus provient de ce thread SO expliquant comment supprimer tous les zéros de tête d'une chaîne dans R. En conséquence de cette expression régulière, "000" et "0" sont transformés en "". Au lieu de cela, je veux supprimer tous les zéros de tête d'une chaîne de caractères, sauf dans les cas où le caractère final se trouve être zéro ou le seul caractère est zéro.
"005" would become "5"
"0AB" would become "AB"
"000" would become "0"
"0" would become "0"
Cet autre thread SO explique comment faire ce que je veux, mais je ne pense pas que je reçois la syntaxe tout à fait correcte, en appliquant la solution dans R. Et je ne comprends pas vraiment la distinction entre la 1ère et la 2ème solution ci-dessous ( s'ils fonctionnaient bien).
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"
Quelle est l'expression rationnelle appropriée dans R pour obtenir ce que je veux?
regex
Noob. Quelle est la différence de performances (ou d'autres préférences) entre votre modèle et celui-ci^0*(.+)$
ou^0+(.+)$
?.
peuvent correspondre0
et les deux modèles adjacents sont quantifiés indéfiniment, mais juste un tout petit peu.Nous pouvons ajouter une condition supplémentaire avec une recherche d'expression régulière pour vérifier les valeurs non nulles après un ou plusieurs zéros (
0+
)Les données
la source
regex
en aucun cas un gourou mais les contournements ne sont pas efficaces, n'est-ce pas? Puisque vous en avez deux,sub
vous pouvez supprimer tous les zéros de tête et les remplacer""
par0
?sub("^$", "0", sub("^0+", "", v1), perl = TRUE)
En utilisant une frontière non mot . Voir cette démo sur regex101 ou une démo R sur tio.run .
\B
Cela ne correspondra pas au dernier zéro, car à sa droite, il n'y a pas de caractère de mot .
la source
Vous pouvez utiliser une alternance pour faire correspondre tous les zéros de la chaîne dans un groupe de capture ou faire correspondre tous les zéros depuis le début de la chaîne.
Dans le groupe d'utilisation de remplacement 1.
Démo Regex | Démo R
Par exemple
Production
Ou encore mieux, comme l'a commenté Wiktor Stribiżew , vous pouvez utiliser la capture d'un seul 0 dans un groupe et répéter le groupe lui-même pour capturer la dernière instance d'un zéro.
Démo Regex
la source
^(0)+$|^0+
sub("^0+(?!$)", "", x, perl=TRUE)
marchera aussiUne autre
regex
option:Voici une démo regex .
Utilisation
base::sub
dans R:Voici un R démo .
Ou développez la réponse de @ akrun :
la source