Regex, um führende Nullen in R zu entfernen, es sei denn, das letzte (oder einzige) Zeichen ist Null

9
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?

Jason Hunter
quelle

Antworten:

6

Sie können alle Nullen vom Anfang einer Zeichenfolge entfernen, aber nicht die letzte:

sub("^0+(?!$)", "", x, perl=TRUE)

Siehe die Regex-Demo .

Einzelheiten

  • ^ - Beginn einer Zeichenfolge
  • 0+ - eine oder mehrere Nullen
  • (?!$) - Ein negativer Lookahead, der die Übereinstimmung nicht besteht, wenn sich unmittelbar rechts von der aktuellen Position ein Ende der Zeichenfolgenposition befindet

Siehe die R-Demo :

x <- c("005", "0AB", "000", "0")
sub("^0+(?!$)", "", x, perl=TRUE)
## => [1] "5"  "AB" "0"  "0"
Wiktor Stribiżew
quelle
1
regexAnfänger. Was ist der Leistungsunterschied (oder andere Einstellungen) zwischen Ihrem Muster und diesem ^0*(.+)$oder ^0+(.+)$?
M--
2
@ M-- Dies sind verschiedene Muster. Es wird empfohlen, nur die Leistung gleichwertiger regulärer Ausdrücke zu vergleichen. Ihre sind ein bisschen ineffizient, da .sie übereinstimmen können, 0und beide benachbarten Muster sind unbegrenzt quantifiziert, aber nur ein kleines bisschen.
Wiktor Stribiżew
4

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.

sub("(?<![0-9])0+(?=[^0])", "", sub("^0+$", "0", v1), perl = TRUE)
#[1] "5"  "AB" "0"  "0" 

Daten

v1 <- c("005", "0AB", "000", "0")
akrun
quelle
1
Ich bin regexin keiner Weise ein Guru, aber Lookarounds sind nicht effizient, oder? Da Sie zwei haben subkönnen Sie alle führenden Nullen entfernen möchten , und ersetzen ""mit 0? sub("^$", "0", sub("^0+", "", v1), perl = TRUE)
M--
2
@ M-- Es wäre nicht so effizient, aber ich habe es verwendet, um dem gleichen Code wie das OP zu folgen
akrun
3

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.

^0*(0)$|^0+

Regex-Demo | R Demo

Zum Beispiel

sub("^0*(0)$|^0+", "\\1", c("005", "0AB", "000", "0"))

Ausgabe

[1] "5"  "AB" "0"  "0"

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.

^(0)+$|^0+

Regex-Demo

Der vierte Vogel
quelle
3
Ich würde verwenden^(0)+$|^0+
Wiktor Stribiżew
3
Sieht so aus, als würde sub("^0+(?!$)", "", x, perl=TRUE)es auch funktionieren
Wiktor Stribiżew
2

Eine weitere regexOption:

^0*(.+)$

Hier ist eine Regex-Demo .

Verwenden base::subin R:

sub("^0*(.+)$", "\\1", c("005", "0AB", "000", "0"))  

 ## [1] "5"  "AB" "0"  "0" 

Hier ist eine R-Demo .

Oder erweitern Sie die Antwort von @ akrun :

sub("^$", "0", sub("^0+", "", c("005", "0AB", "000", "0")), perl = TRUE)
M--
quelle