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.
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
Zur Antwort hinzugefügt. Lassen Sie es mich wissen, wenn Sie eine Klärung benötigen. – G5W