403 Stimmen

Prüfen, ob Zeichen in einer Zeichenkette enthalten sind

Ich versuche zu bestimmen, ob eine Zeichenfolge eine Teilmenge einer anderen Zeichenfolge ist. Zum Beispiel:

chars <- "test"
value <- "es"

Ich möchte zurückkehren TRUE wenn " value " erscheint als Teil der Zeichenfolge " chars ". In dem folgenden Szenario würde ich false zurückgeben wollen:

chars <- "test"
value <- "et"

23voto

C. Zeng Punkte 635

Für den Fall, dass Sie auch prüfen möchten, ob eine Zeichenkette (oder eine Reihe von Zeichenketten) mehrere Teilzeichenketten enthält, können Sie auch das Zeichen "|" zwischen zwei Teilzeichenketten verwenden.

>substring="as|at"
>string_vector=c("ass","ear","eye","heat") 
>grepl(substring,string_vector)

Sie erhalten

[1]  TRUE FALSE FALSE  TRUE

da das 1. Wort die Teilzeichenkette "as" und das letzte Wort die Teilzeichenkette "at" enthält

11voto

Chris Punkte 5890

Utilice grep o grepl aber achten Sie darauf, ob Sie reguläre Ausdrücke verwenden wollen oder nicht .

Standardmäßig, grep und verwandte nehmen eine regulärer Ausdruck übereinstimmen, nicht eine wörtliche Teilzeichenkette. Wenn Sie das nicht erwarten und versuchen, eine ungültige Regex abzugleichen, funktioniert es nicht:

> grep("[", "abc[")
Error in grep("[", "abc[") : 
  invalid regular expression '[', reason 'Missing ']''

Um einen echten Teilstring-Test durchzuführen, verwenden Sie fixed = TRUE .

> grep("[", "abc[", fixed = TRUE)
[1] 1

Wenn Sie Regex wollen, toll, aber das ist nicht das, was der OP zu fragen scheint.

7voto

nico Punkte 49590

Sie können verwenden grep

grep("es", "Test")
[1] 1
grep("et", "Test")
integer(0)

1voto

Alex L Punkte 430

Ähnliches Problem hier: Ermitteln Sie anhand einer Zeichenkette und einer Liste von Schlüsselwörtern, ob und welche der Schlüsselwörter in der Zeichenkette enthalten sind.

Die Empfehlungen in diesem Thread lauten stringr 's str_detect y grepl . Hier sind die Benchmarks aus dem microbenchmark Paket:

Verwendung von

map_keywords = c("once", "twice", "few")
t = "yes but only a few times"

mapper1 <- function (x) {
  r = str_detect(x, map_keywords)
}

mapper2 <- function (x) {
  r = sapply(map_keywords, function (k) grepl(k, x, fixed = T))
}

und dann

microbenchmark(mapper1(t), mapper2(t), times = 5000)

finden wir

Unit: microseconds
       expr    min     lq     mean  median      uq      max neval
 mapper1(t) 26.401 27.988 31.32951 28.8430 29.5225 2091.476  5000
 mapper2(t) 19.289 20.767 24.94484 23.7725 24.6220 1011.837  5000

Wie Sie sehen können, wurden über 5.000 Iterationen der Stichwortsuche mit str_detect y grepl über eine praktische Zeichenfolge und einen Vektor von Schlüsselwörtern, grepl schneidet um einiges besser ab als str_detect .

Das Ergebnis ist der boolesche Vektor r die angibt, ob und welche Schlüsselwörter in der Zeichenkette enthalten sind.

Ich empfehle daher die Verwendung von grepl um festzustellen, ob Schlüsselwörter in einer Zeichenkette enthalten sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X