R Language
Musterabgleich und Ersatz
Suche…
Einführung
Dieses Thema behandelt übereinstimmende Zeichenfolgenmuster sowie das Extrahieren oder Ersetzen dieser Muster. Einzelheiten zum Definieren komplizierter Muster finden Sie unter Reguläre Ausdrücke .
Syntax
grep ("query", "subject", optional_args)
grepl ("Abfrage", "Betreff", optional_args)
gsub ("(group1) (group2)", "\\ group #", "subject")
Bemerkungen
Unterschiede zu anderen Sprachen
Entkam regex Symbole (wie \1
) werden muss ein zweites Mal (wie entwertet werden \\1
), nicht nur in dem pattern
Argumente, sondern auch im replacement
zu sub
und gsub
.
Standardmäßig handelt es sich bei dem Muster für alle Befehle (grep, sub, regexpr) nicht um Perl-kompatible reguläre Ausdrücke (PCRE). Einige Dinge wie Lookarounds werden nicht unterstützt. Jede Funktion akzeptiert jedoch ein perl=TRUE
Argument, um sie zu aktivieren. Weitere Informationen finden Sie im Abschnitt R reguläre Ausdrücke .
Spezialisierte Pakete
- stringi
- stringr
Substitutionen machen
# example data
test_sentences <- c("The quick brown fox quickly", "jumps over the lazy dog")
Lassen Sie uns den braunen Fuchs rot machen:
sub("brown","red", test_sentences)
#[1] "The quick red fox quickly" "jumps over the lazy dog"
Nun lassen Sie uns das machen "fast"
Fuchs Akt "fastly"
. Das wird es nicht tun:
sub("quick", "fast", test_sentences)
#[1] "The fast red fox quickly" "jumps over the lazy dog"
sub
macht nur den ersten verfügbaren Ersatz, wir brauchen gsub
für den globalen Austausch :
gsub("quick", "fast", test_sentences)
#[1] "The fast red fox fastly" "jumps over the lazy dog"
Weitere Beispiele finden Sie unter Ersetzen von Zeichenfolgen .
Übereinstimmungen finden
# example data
test_sentences <- c("The quick brown fox", "jumps over the lazy dog")
Gibt es eine Übereinstimmung?
grepl()
wird verwendet, um zu prüfen, ob ein Wort oder ein regulärer Ausdruck in einem String oder Zeichenvektor vorhanden ist. Die Funktion gibt einen TRUE / FALSE (oder "Boolean") - Vektor zurück.
Beachten Sie, dass wir jeden String auf das Wort "fox" prüfen können und im Gegenzug einen booleschen Vektor erhalten.
grepl("fox", test_sentences)
#[1] TRUE FALSE
Orte abgleichen
grep
übernimmt eine Zeichenkette und einen regulären Ausdruck. Es gibt einen numerischen Vektor von Indizes zurück. Dadurch wird der Satz zurückgegeben, der das Wort "Fuchs" enthält.
grep("fox", test_sentences)
#[1] 1
Übereinstimmende Werte
So wählen Sie Sätze aus, die einem Muster entsprechen:
# each of the following lines does the job:
test_sentences[grep("fox", test_sentences)]
test_sentences[grepl("fox", test_sentences)]
grep("fox", test_sentences, value = TRUE)
# [1] "The quick brown fox"
Einzelheiten
Da es sich bei dem "fox"
-Muster nicht um einen regulären Ausdruck, sondern um ein Wort handelt, können Sie die Leistung verbessern (entweder mit grep
oder grepl
), indem Sie fixed = TRUE
grepl
.
grep("fox", test_sentences, fixed = TRUE)
#[1] 1
Um Sätze auszuwählen, die keinem Muster entsprechen, können Sie grep
mit invert = TRUE
. oder folgen Sie den Subsetting- Regeln mit -grep(...)
oder !grepl(...)
.
Sowohl in grepl(pattern, x)
als auch in grep(pattern, x)
ist der x
Parameter vektorisiert , der pattern
Parameter jedoch nicht. Daher können Sie diese nicht direkt verwenden, um pattern[1]
mit x[1]
, pattern[2]
mit x[2]
usw. abzugleichen.
Zusammenfassung der Spiele
Nach dem Ausführen des Befehls grepl
möchten Sie möglicherweise einen Überblick darüber erhalten, wie viele Übereinstimmungen TRUE
oder FALSE
. Dies ist z. B. bei großen Datensätzen hilfreich. Führen Sie dazu den summary
Befehl aus:
# example data
test_sentences <- c("The quick brown fox", "jumps over the lazy dog")
# find matches
matches <- grepl("fox", test_sentences)
# overview
summary(matches)
Single und Global Match.
Wenn Sie mit regulären Ausdrücken arbeiten, ist ein Modifikator für PCRE g
für globale Übereinstimmung.
In R haben Matching- und Replacement-Funktionen zwei Versionen: First Match und Global Match:
sub(pattern,replacement,text)
ersetzt das erste Vorkommen von Muster durch Ersetzen im Textgsub(pattern,replacement,text)
wird dasselbe tun wie sub, jedoch für jedes Auftreten eines Mustersregexpr(pattern,text)
gibt die Position der Übereinstimmung für die erste Instanz des Musters zurückgregexpr(pattern,text)
gibt alle Übereinstimmungen zurück.
Einige zufällige Daten:
set.seed(123)
teststring <- paste0(sample(letters,20),collapse="")
# teststring
#[1] "htjuwakqxzpgrsbncvyo"
Mal sehen, wie das funktioniert, wenn wir Vokale durch etwas anderes ersetzen wollen:
sub("[aeiouy]"," ** HERE WAS A VOWEL** ",teststring)
#[1] "htj ** HERE WAS A VOWEL** wakqxzpgrsbncvyo"
gsub("[aeiouy]"," ** HERE WAS A VOWEL** ",teststring)
#[1] "htj ** HERE WAS A VOWEL** w ** HERE WAS A VOWEL** kqxzpgrsbncv ** HERE WAS A VOWEL** ** HERE WAS A VOWEL** "
Nun wollen wir sehen, wie wir einen Konsonanten finden können, dem unmittelbar ein oder mehrere Vokale folgen:
regexpr("[^aeiou][aeiou]+",teststring)
#[1] 3
#attr(,"match.length")
#[1] 2
#attr(,"useBytes")
#[1] TRUE
Wir haben eine Übereinstimmung auf Position 3 der Zeichenfolge der Länge 2, dh: ju
Nun, wenn wir alle Spiele bekommen wollen:
gregexpr("[^aeiou][aeiou]+",teststring)
#[[1]]
#[1] 3 5 19
#attr(,"match.length")
#[1] 2 2 2
#attr(,"useBytes")
#[1] TRUE
Das alles ist wirklich großartig, aber dies gibt nur Spielpositionen des Spiels und es ist nicht so einfach, das zu finden, was übereinstimmt, und hier kommt das regmatches
es ist nur der Zweck, die übereinstimmende Zeichenfolge aus regexpr zu extrahieren, aber es hat eine andere Syntax.
Speichern Sie unsere Übereinstimmungen in einer Variablen und extrahieren Sie sie aus dem ursprünglichen String:
matches <- gregexpr("[^aeiou][aeiou]+",teststring)
regmatches(teststring,matches)
#[[1]]
#[1] "ju" "wa" "yo"
Dies mag seltsam klingen, wenn es keine Abkürzung gibt, aber dies erlaubt das Extrahieren aus einer anderen Saite durch die Übereinstimmungen unserer ersten (denken Sie daran, zwei lange Vektoren miteinander zu vergleichen, bei denen Sie wissen, dass es ein gemeinsames Muster für die erste, aber nicht für die zweite, dies erlaubt eine einfacher Vergleich):
teststring2 <- "this is another string to match against"
regmatches(teststring2,matches)
#[[1]]
#[1] "is" " i" "ri"
Achtung: Standardmäßig ist das Muster kein Perl-kompatibler regulärer Ausdruck. Einige Dinge wie Lookarounds werden nicht unterstützt, aber jede hier dargestellte Funktion ermöglicht das Argument perl=TRUE
, um sie zu aktivieren.
Finden Sie Übereinstimmungen in großen Datensätzen
Bei großen Datenmengen grepl("fox", test_sentences)
der Aufruf von grepl("fox", test_sentences)
nicht gut. Big Data-Sets sind beispielsweise gecrawlte Websites oder Millionen von Tweets usw.
Die erste Beschleunigung ist die Verwendung der Option perl = TRUE
. Noch schneller ist die Option fixed = TRUE
. Ein vollständiges Beispiel wäre:
# example data
test_sentences <- c("The quick brown fox", "jumps over the lazy dog")
grepl("fox", test_sentences, perl = TRUE)
#[1] TRUE FALSE
Bei Text Mining wird häufig ein Korpus verwendet. Ein Korpus kann nicht direkt mit grepl
. Betrachten Sie daher diese Funktion:
searchCorpus <- function(corpus, pattern) {
return(tm_index(corpus, FUN = function(x) {
grepl(pattern, x, ignore.case = TRUE, perl = TRUE)
}))
}