2016-06-18 16 views
-1

Ich habe eine Zeichenfolge und möchte die ersten Sätze von drei Zahlen und drei beliebige Buchstaben neben jeder Zahl extrahieren und dann in einen Vektor einfügen. So folgt aus:Extrahieren von Zahlen und Text aus String in R

t1 <- "The string contains numbers ranging from 3-4 cm and can reach up to 5.6 m long, and sometimes can even reach 10 m." 

t1 würde:

"3-4 cm", "5.6 m", "10m" 

Ich habe verschiedene Funktionen regulärer Ausdrücke wie grep aufblickte, Grepl usw., kann aber nicht Beispiel finden, die meine Abfrage übereinstimmt. Irgendwelche Vorschläge?

+0

Es wäre hilfreich, wenn Sie einige Daten bereitstellen könnten, mit denen die Leute spielen können (ein Spielzeugbeispiel). – milan

+0

Vorschläge: 'gregexpr' und' regmatches' oder da ist das 'stringi' Paket und seine 'stri_extract_all' Funktionen. 'gsub' könnte auch funktionieren. – Jota

Antwort

0

können Sie versuchen, diesen regulären Ausdruck [0-9.-]+\\s+[a-zA-z]{1,3} und verwenden Sie die str_extract_all von stringr Paket ihnen zu extrahieren:

stringr::str_extract_all(t1, "[0-9.-]+\\s+[a-zA-Z]{1,3}") 
[[1]] 
[1] "3-4 cm" "5.6 m" "10 m" 
+0

Danke für die schnelle Antwort und den Vorschlag. Ich war in der Tat hilfreich. Ich schätze es. – BHD

+0

Vielen Dank für Ihren Vorschlag. Ich habe jedoch festgestellt, dass der Code einige Zahlen auslässt, die in Klammern eingebettet sind. Nehmen wir zum Beispiel an, in meinem vorherigen Beispiel füge ich eine Zahl in Klammern wie folgt hinzu: t1 <- "Die Zeichenfolge enthält Zahlen von 3-4 cm oder 120 (-150) cm groß und kann bis zu 5,6 m lang erreichen, und manchmal können sogar 10 m erreichen. " Der Code gibt nur {"3-4 cm" "5.6 m" "10 m"} zurück, lässt aber den "120 (-150) cm" aus. Jeder Vorschlag, wie die Zahlen zusätzlich zu den nicht eingebetteten in Klammern extrahiert werden in Klammern? – BHD

+0

Fügen Sie einfach '()' zu der Zeichenklasse sollte in Ordnung sein. 'stringr :: str_extract_all (t1," [-() 0-9.] + \\ s + [a-zA-Z] {1,3} ") sollte funktionieren – Psidom

1

Hier ist, wie dies mit gregexpr() + regmatches() erfolgen:

ipartRE <- '\\d+'; 
fpartRE <- '\\.\\d+'; 
numRE <- paste0(ipartRE,'(?:',fpartRE,')?'); 
rangeRE <- paste0(numRE,'(?:\\s*-\\s*',numRE,')?'); 
pat <- paste0(rangeRE,'\\s*[a-zA-Z]{1,3}\\b'); 
regmatches(t1,gregexpr(perl=T,pat,t1))[[1L]]; 
## [1] "3-4 cm" "5.6 m" "10 m" 

I aufgebaut die Regex inkrementell aus Komponenten für die menschliche Lesbarkeit, aber offensichtlich müssen Sie das nicht tun.

Um dem neuen Muster zu entsprechen, müssen wir eine Alternierung für die zweite Zahl akzeptieren, die passende Klammern um die Zahl enthält. Ich fand auch, dass der Strich in 120(–150) cm in nicht einem normalen ASCII hyphen, sondern ist ein en dash, und so habe ich einen weiteren vorberechneten regulären Ausdruck Stück dashRE genannt, die alle drei gemeinsamen Strich Typen entspricht (ASCII, en Bindestrich und em dash):

ipartRE <- '\\d+'; 
fpartRE <- '\\.\\d+'; 
numRE <- paste0(ipartRE,'(?:',fpartRE,')?'); 
dashRE <- '[—–-]'; 
rangeOptParenRE <- paste0(numRE,'(?:\\s*(?:',dashRE,'\\s*',numRE,'|\\(\\s*',dashRE,'\\s*',numRE,'\\s*\\)\\s*))?'); 
pat <- paste0(rangeOptParenRE,'\\s*[a-zA-Z]{1,3}\\b'); 
regmatches(t1,gregexpr(perl=T,pat,t1))[[1L]]; 
## [1] "3-4 cm"  "120(–150) cm" "5.6 m"  "10 m" 
+1

Vielen Dank für den Vorschlag. Ich schätze es. – BHD

+0

Danke für den Vorschlag, der hilfreich war. Ich habe jedoch festgestellt, dass der Code einige Zahlen auslässt, die in Klammern eingebettet sind.Nehmen wir zum Beispiel an, in meinem vorherigen Beispiel füge ich eine Zahl in Klammern wie folgt hinzu: t1 <- "Die Zeichenfolge enthält Zahlen von 3-4 cm oder 120 (-150) cm groß und kann bis zu 5,6 m lang werden und manchmal sogar 10 m erreichen. " Der Code gibt nur {"3-4 cm" "5,6 m" "10 m"} zurück, aber die "120 (-150) cm" Alle Vorschläge, wie die Zahlen in Klammern zusammen mit der extrahieren welche sind nicht in Klammern eingebettet? – BHD

+0

@BHD Siehe Bearbeiten. – bgoldst