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

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 Text

  • gsub(pattern,replacement,text) wird dasselbe tun wie sub, jedoch für jedes Auftreten eines Musters

  • regexpr(pattern,text) gibt die Position der Übereinstimmung für die erste Instanz des Musters zurück

  • gregexpr(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)
  }))
} 


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow