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" "" ""
Der obige reguläre Ausdruck stammt aus diesem SO-Thread und erklärt, wie alle führenden Nullen aus einer Zeichenfolge in R entfernt werden. Infolge dieses regulären Ausdrucks werden sowohl "000" als auch "0" in "" transformiert. Stattdessen möchte ich alle führenden Nullen aus einer Zeichenfolge entfernen, mit Ausnahme der Fälle, in denen das letzte Zeichen zufällig Null ist oder das einzige Zeichen Null ist.
"005" would become "5"
"0AB" would become "AB"
"000" would become "0"
"0" would become "0"
Dieser andere SO-Thread erklärt, wie man macht, was ich will, aber ich glaube nicht, dass ich die Syntax ganz richtig verstehe, wenn ich die Lösung in R anwende. Und ich verstehe den Unterschied zwischen der 1. und 2. Lösung unten nicht wirklich ( wenn sie tatsächlich funktionierten).
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"
Was ist der richtige reguläre Ausdruck in R, um das zu bekommen, was ich will?
regex
Anfänger. Was ist der Leistungsunterschied (oder andere Einstellungen) zwischen Ihrem Muster und diesem^0*(.+)$
oder^0+(.+)$
?.
sie übereinstimmen können,0
und beide benachbarten Muster sind unbegrenzt quantifiziert, aber nur ein kleines bisschen.Wir können eine weitere Bedingung mit einer Regex-Lookaround hinzufügen, um nach einer oder mehreren Nullen (
0+
) nach Nicht-Null-Werten zu suchen.Daten
quelle
regex
in keiner Weise ein Guru, aber Lookarounds sind nicht effizient, oder? Da Sie zwei habensub
können Sie alle führenden Nullen entfernen möchten , und ersetzen""
mit0
?sub("^$", "0", sub("^0+", "", v1), perl = TRUE)
Durch Verwendung einer Nicht- Wortgrenze . Sehen Sie sich diese Demo unter regex101 oder eine R-Demo unter tio.run an .
\B
Dies stimmt nicht mit der letzten Null überein, da rechts davon kein Wortzeichen steht .
quelle
Sie können eine Abwechslung verwenden, um entweder alle Nullen in der Zeichenfolge in einer Erfassungsgruppe oder alle Nullen vom Anfang der Zeichenfolge an abzugleichen.
Verwenden Sie in der Ersatzgruppe 1.
Regex-Demo | R Demo
Zum Beispiel
Ausgabe
Oder noch besser, wie von Wiktor Stribiżew kommentiert , können Sie eine einzelne 0 in einer Gruppe erfassen und die Gruppe selbst wiederholen, um die letzte Instanz einer Null zu erfassen.
Regex-Demo
quelle
^(0)+$|^0+
sub("^0+(?!$)", "", x, perl=TRUE)
es auch funktionierenEine weitere
regex
Option:Hier ist eine Regex-Demo .
Verwenden
base::sub
in R:Hier ist eine R-Demo .
Oder erweitern Sie die Antwort von @ akrun :
quelle