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" "" ""
Powyższe wyrażenie regularne pochodzi z tego wątku SO wyjaśniającego, jak usunąć wszystkie zera wiodące z ciągu w R. W wyniku tego wyrażenia regularnego zarówno „000”, jak i „0” są przekształcane w „”. Zamiast tego chcę usunąć wszystkie wiodące zera z ciągu znaków, z wyjątkiem przypadków, gdy końcowy znak ma wartość zero lub jedynym znakiem jest zero.
"005" would become "5"
"0AB" would become "AB"
"000" would become "0"
"0" would become "0"
Ten drugi wątek SO wyjaśnia, jak zrobić to, co chcę, ale nie wydaje mi się, że otrzymuję poprawną składnię, stosując rozwiązanie w R. I tak naprawdę nie rozumiem różnicy między pierwszym i drugim rozwiązaniem poniżej ( jeśli rzeczywiście działały).
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"
Jaki jest poprawny wyraz regularny w R, aby uzyskać to, czego chcę?
regex
Nowicjusz. Jaka jest różnica w wydajności (lub innych preferencjach) między twoim wzorcem a tym^0*(.+)$
lub^0+(.+)$
?.
można dopasować,0
a oba sąsiednie wzorce są nieokreślone ilościowo, ale tylko trochę.Możemy dodać jeszcze jeden warunek z wyrażeniem regularnym, aby sprawdzić wartości niezerowe po jednym lub więcej zerach (
0+
)dane
źródło
regex
w żaden sposób guru, ale spojrzenia nie są skuteczne, prawda? Ponieważ masz dwa,sub
możesz usunąć wszystkie wiodące zera i zastąpić""
je0
?sub("^$", "0", sub("^0+", "", v1), perl = TRUE)
Używając granicy innej niż słowo . Zobacz to demo na regex101 lub demo R na tio.run .
\B
To nie będzie pasować do ostatniego zera, ponieważ tuż po nim nie ma znaku słowa .
źródło
Możesz użyć alternacji, aby dopasować wszystkie zera w ciągu w grupie przechwytywania lub dopasować wszystkie zera od początku ciągu.
W zastępczej grupie zastosowań 1.
Wersja demo | Demo R.
Na przykład
Wynik
Lub nawet lepiej, jak komentuje Wiktor Stribiżew , możesz użyć przechwytywania pojedynczego 0 w grupie i powtarzania samej grupy, aby uchwycić ostatnie wystąpienie zera.
Demo Regex
źródło
^(0)+$|^0+
sub("^0+(?!$)", "", x, perl=TRUE)
że również zadziałaInna
regex
opcja:Oto demo wyrażenia regularnego .
Używanie
base::sub
w R:Oto demo R .
Lub rozwinięcie odpowiedzi @ akrun :
źródło