2017-08-28 4 views
-2

Ich muss die 3.93, 4.63999 ... und -5,35 erfassen. Ich habe alle möglichen Varianten ausprobiert, konnte aber nicht den richtigen Satz von Zahlen finden.Regex: Zahlen am Anfang und Negieren von Zahlen nach Zeichen

Copay: 20.30

3,93

TAB 8.6MG Menge: 60

4,6399999999999997

-5,35

2,000UNIT TAB Menge: 30

AMOUNT

Menge: 180

CAP 4MG

+2

Sie müssen also Linien erfassen, die nur Zahlen, Dezimalzahlen und negative Vorzeichen? Was genau hast du versucht, das hat nicht funktioniert? – MrFlick

+2

Wenn Sie mehrere Zeilen oder Zeilen haben, warum nicht etwas wie 'as.numeric (line)' tun und dann NAs entfernen. Ich sehe hier keine Notwendigkeit für Regex. –

+0

Können Sie genauer erklären, was genau diese Zahlen für Ihr Spiel ausmachen (und was die anderen disqualifiziert)? So wie Ihre Frage formuliert ist, können Sie einfach das Muster '3 \ .93 | 4 \ .63999 \ d * | -5 \ .35' verwenden. – CAustin

Antwort

1
x = c("Copay: 20.30", "3.93", "TAB 8.6MG Qty:60", "4.6399999999999997", "-5.35", "2,000UNIT TAB Qty:30", "AMOUNT", "Qty:180", "CAP 4MG"); 
grep("^[\\-]?\\d+[\\.]?\\d+$", x); 

Ausgang (siehe ?grep):

[1] 2 4 5 

Wenn führende/Leerzeichen erlaubt Änderung der regex mit

"^\\s*[\\-]?\\d+[\\.]?\\d+\\s*$" 
0

Versuchen Sie diese

S <- c("Copay: 20.30", "3.93", "TAB 8.6MG Qty:60", "4.6399999999999997", "-5.35", "2,000UNIT TAB Qty:30", "AMOUNT", "Qty:180", "CAP 4MG") 

library(stringr) 
ans <- str_extract_all(S, "-?[[:digit:]]*(\\.|,)?[[:digit:]]+", simplify=TRUE) 
clean <- ans[ans!=""] 

Ausgabe

[1] "20.30"    "3.93"    "8.6"    
[4] "4.6399999999999997" "-5.35"    "2,000"    
[7] "180"    "4"     "60"     
[10] "30" 
Verwandte Themen