2016-11-27 1 views
2

Ich habe von Ronak Shah und akrun gelernt (in this post) wie einen regulären Ausdruck zu konstruieren alle Begriffe von einem Datenrahmen (alldata in meinem Beispiel) mit Ausnahme der Wörter auszuschließen,Mit R, wie benutze ich str_extract in diesem Fall?

^\ BWORD1 | WORD2 | WORD3 | Word4 | WORD5 \>

aber aus irgendwelchen Gründen, herausfinden kann nicht, warum es mir gibt

"WORD2", "WORD3", NA

statt

"WORD1 WORD2 WORD5", "WORD3", NA

hier ist mein Beispiel:

library(stringr) 
alldata <- data.frame(toupper(c("word1 anotherword word2 word5", "word3", "none"))) 
names(alldata)<-"columna" 
removeex <- c("word1" , "word2" ,"word3" ,"word4", "word5") 
regularexprex <- toupper(paste0("^\\b",paste0(removeex, collapse = "|"), "\\>")) 
alldata$columnb <- str_extract(alldata$columna, regularexprex) 

Ich habe versucht, + hinzuzufügen, oder * bei das Ende des regulären Ausdrucks, aber ohne Auswirkungen.

Aufgrund der Tatsache, dass ich ein Anfänger auf Regex bin, vermisse ich sicherlich etwas, kann mir jemand dabei helfen? Grüße,

+0

Sie meinen, Sie müssen NA für alle Einträge in einer bestimmten Liste erhalten? –

+0

Ich möchte alle Wörter innerhalb des Datenrahmens, die in der Liste vorhanden sind, behalten, den Rest löschen. Wenn nicht, werde ich eine NA bekommen. Tut mir leid, dass ich nicht klar bin. –

Antwort

2

Sie müssen die letzten beiden Zeilen in Ihrem obigen Code zu

> regularexprex <- paste0("(?i)\\s*\\b(?!(?:",paste0(removeex, collapse = "|"), ")\\b)\\w+") 
## => "(?i)\\s*\\b(?!(?:word1|word2|word3|word4|word5)\\b)\\w+" 
> str_replace_all(alldata$columna, regularexprex, "") 
[1] "WORD1 WORD2 WORD5" "WORD3"    "" 

Erster ersetzen, die toupper() gedreht \b zu \B (Nicht-Wortgrenze) - Sie brauchen nur ein Groß- und Kleinschreibung Matching (Ich habe den Modifikator (?i) hinzugefügt, und die Wortgrenzen wurden nicht auf die Gruppe angewendet, sondern nur auf die Elemente auf beiden Seiten.

Auch, was Sie brauchen, ist ein Muster, um die gesamte Zeichenfolge, so .* am Anfang und Ende des Musters.

Die endgültige regex für ersetzt sieht aus wie

(?i)\s*\b(?!(?:word1|word2|word3|word4|word5)\b)\w+ 

den See regex demo

Wenn Sie Ihre Eingaben Zeilenumbrüche enthalten, sollten Sie auch s Modifikator hinzufügen: (?i) ->(?s).

Einzelheiten:

  • (?i) - Groß- und Kleinschreibung Modifikator (funktioniert mit PCRE und ICU Regexes)
  • \s* - 0+ Whitespaces
  • \b - eine führenden Wortgrenze
  • (?!(?:word1|word2|word3|word4|word5)\b) - dem Wort kann nicht gleich word1 usw.
  • sein- 1 + Wort Zeichen (Buchstaben, Ziffern oder Unterstriche).
+0

Danke Wiktor, aber ANONDERWORD ist immer noch in der Liste, da es nicht zu der Liste word1 | word2 | word3 | word4 | word5 gehört. Wie kann ich das ausschließen? Danke für Ihre Hilfe und Link. –

+0

Um ein bisschen genauer zu sein, wenn ich (? I). * \ B (word1 | word2 | word3 | word4 | word5) \ b. * Verwende, bekomme ich word5 und word3 in der zweiten Zeile. Ich verstehe nicht, wie man Wort1 Wort2 Wort5 in der ersten Zeile und Wort5 in der zweiten Zeile hat. –

+0

Siehe die aktualisierte Antwort. Sie scheinen alle Wörter entfernen zu wollen, die nicht in der Liste enthalten sind. –

Verwandte Themen