2017-02-16 5 views
0

Edited, um die Sprache zu markieren, die ich verwende Ich benutze die Sprache R und ich habe viele große Listen von Zeichenketten und sie haben eine ähnliche Format. Ich interessiere mich für die Zeichen direkt vor einer Reihe von Zeichen, die konsistent in der Zeichenfolge sind, aber nicht an einer konsistenten Stelle innerhalb der Zeichenfolge. Zum Beispiel:So extrahieren Sie Zeichen aus einer Zeichenfolge basierend auf dem Text um sie in R

a <- "aabbccddeeff" 
b <- "aabbddff" 
c <- "aabbffgghhii" 
d <- "bbffgghhii" 

Ich interessiere mich für das Extrahieren der zwei Zeichen vor direkt die "ff" in jeder Zeichenkette. Ich kann keine vernünftige Lösung finden, abgesehen davon, dass ich jede Zeichenkette unter Verwendung von grepl() zerlege und sie dann unabhängig voneinander verarbeite, was wie eine ineffiziente Art und Weise erscheint, dies zu tun.

Antwort

2

Sie können diese beiden Zeichen abgleichen und sie mit Sub- und dem richtigen regulären Ausdruck erfassen.

Strings = c("aabbccddeeff", 
    "aabbddff", 
    "aabbffgghhii", 
    "bbffgghhii") 
sub(".*(\\w\\w)ff.*", "\\1", Strings) 
[1] "ee" "dd" "bb" "bb" 

Erklärung, Dies ersetzt die gesamte Zeichenfolge durch die zwei Zeichen vor dem "ff". Wenn es mehrere "ff" in der Zeichenfolge gibt, nimmt dieser Ausdruck die zwei Zeichen vor der letzten "ff".

Wie das funktioniert: Die drei Argumente Unter sind:
1. ein Muster für
2. zu suchen Was wird es mit
3. Die Saiten ersetzt werden, um es anzuwenden.

Die meiste Arbeit ist im Musterteil - .*(\\w\\w)ff.*. Der ff-Teil des Musters muss offensichtlich sein. Wir zielen auf Dinge in der Nähe der spezifischen Zeichenfolge ff ab. Was kommt, bevor es ist (\\w\\w). \ w bezieht sich auf ein "Wortzeichen". Das bedeutet irgendeinen Buchstaben a-z oder A-Z, irgendeine Ziffer 0-9 oder das andere Zeichen _. Wir wollen zwei Zeichen, also haben wir \\w\\w. Durch Einschließen von \\w\\w in Klammern verwandelt es dieses Muster aus zwei Zeichen in eine "Erfassungsgruppe", eine Zeichenfolge, die zur späteren Verwendung in einer Variablen gespeichert wird. Da dies die erste (und einzige) Erfassungsgruppe in diesem Ausdruck ist, werden diese beiden Zeichen in einer Variablen namens \ 1 gespeichert. Jetzt wollen wir nur diese zwei Zeichen, also um alles wegzublasen bevor und nachdem wir setzen .* an der Vorder- und Rückseite. . entspricht einem beliebigen Zeichen und * bedeutet, dass dies Null oder mehrere Male tun, so .* Null oder mehr Kopien eines beliebigen Zeichens bedeutet. Jetzt haben wir die Saite in vier Teile zerlegt: "ff", die zwei Zeichen vor "ff", alles davor und alles nach dem ff. Dies deckt den gesamten String ab. sub wird den Teil ersetzen, der (alles) mit dem übereinstimmt, was er im Substitutionsmuster sagt, in diesem Fall "\ 1". So schreiben Sie eine Zeichenfolge, die \1, den Namen der Variablen, in der wir die zwei Zeichen, die wir wollen, gespeichert hat. Wir schreiben es so, weil Backslash "entkommt" was auch immer danach ist. Wir wollen eigentlich das Zeichen, also schreiben wir \ und \ 1 auf \ 1. So wird alles in der Zeichenfolge durch die zwei Zielzeichen ersetzt. Wir wenden das auf jede Zeichenfolge in der Liste der Zeichenfolgen Strings an.

+0

Ausgezeichnet. Das funktioniert super, vielen Dank. Allerdings fällt es mir schwer, herauszufinden, was kontrolliert wird. Können Sie mich durch die Syntax innerhalb der 'sub()' Funktion führen? – Jesse

+0

Zur Antwort hinzugefügt. Lassen Sie es mich wissen, wenn Sie eine Klärung benötigen. – G5W

Verwandte Themen