2014-05-08 7 views
8

Ich habe einen Charakter Vektor d mit alphanumerischen ZeichenEntfernen führende Nullen aus alphanumerischen Zeichen in R

d <- c("template", "separate 00340", "00045", "890 098", "3405 garage", "matter00908") 

d 
[1] "template" "separate 00340" "00045"   "890 098"   "3405 garage"  "matter00908" 

Wie kann ich die führenden Nullen aus allen Zahlen in R entfernen? as.numeric werden alle führenden Nullen nur in numerischen oder Integer-Vektoren entfernen. Ich habe versucht gsub mit regex aber konnte nicht die gewünschten Ergebnisse erhalten.

die erwartete Ausgabe ist als

out <- c("12309 template", "seperate 340", "45", "890 98", "3405 garage", "matter908") 
out 
[1] "12309 template" "seperate 340" "45"    "890 98"   "3405 garage" "matter908" 

Antwort

13

Sie eine negative Lookbehind 0, es sei denn durch eine Ziffer voran zu beseitigen verwenden:

> d <- c("100001", "template", "separate 00340", "00045", "890 098", "3405 garage", "matter00908") 
> gsub("(?<![0-9])0+", "", d, perl = TRUE) 
[1] "100001"   "12309 template" "separate 340" "45"    
[5] "890 98"   "3405 garage" "matter908"  

Ein anderer Weg regex:

> gsub("(^|[^0-9])0+", "\\1", d, perl = TRUE) 
[1] "100001"   "12309 template" "separate 340" "45"    
[5] "890 98"   "3405 garage" "matter908"  
> 
+0

Dadurch werden auch mehrere Nullen innerhalb numerischer Zeichenfolgen entfernt, z. 100001 bis 101. – Crops

+1

@Crops Sollte jetzt behoben werden. – devnull

7

folgt Hier ist die Lösung stri_replace_all_regex vom stringi Paket verwendet:

d <- c("template", "separate 00340", "00045", 
     "890 098", "3405 garage", "matter00908") 
library("stringi") 
stri_replace_all_regex(d, "\\b0*(\\d+)\\b", "$1") 
## [1] "12309 template" "separate 340" "45"    "890 98" 
## [5] "3405 garage" "matter00908" 

Erläuterung: Wir sind alle Sequenzen von Ziffern innerhalb von Wortgrenzen Matching (\b). Nachlaufende Nullen sind gierig aufeinander abgestimmt (0+). Die verbleibenden Ziffern (\d bezeichnet eine Ziffer, \d+ bezeichnet ihre nicht leere Sequenz) werden innerhalb einer Gruppe ((...)) erfasst. Dann ersetzen wir alle solche Übereinstimmungen nur durch die Gruppen-gefangenen Sachen.

Wenn Sie auch in Worten 0s entfernen würde mir wünschen (wie in Ihrem Beispiel), lassen Sie nur \b und rufen:

stri_replace_all_regex(d, "0*(\\d+)", "$1") 
## [1] "12309 template" "separate 340" "45"    "890 98" 
## [5] "3405 garage" "matter908" 
+0

Was ist mit dem '\\ d +'? –

+1

bearbeitet: * '\ d' steht für eine beliebige Ziffer,' \ d + 'steht für eine nicht leere Zeichenfolge * – gagolews

Verwandte Themen