Frage

Wie mit mehr als 9 Rückreferenzierungen verwenden gsub? Ich würde unter dem Ausgang in dem Beispiel erwarten, dass "e, g, i, j, o".

> test <- "abcdefghijklmnop"
> gsub("(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)", "\\5, \\7, \\9, \\10, \\15", test, perl = TRUE)
[1] "e, g, i, a0, a5"
War es hilfreich?

Lösung

Siehe Reguläre Ausdrücke mit der R Sprache :

  

Sie können die Rückreferenzierungen verwenden \1 durch \9 im Ersetzungstext Text von einem Erfassungsgruppe abgestimmt wieder einsetzen . Es gibt keinen Ersatz Text-Token für das Gesamt-Match. Legen Sie die gesamte Regex in einer Erfassungsgruppe und dann \1 verwenden.

Aber mit PCRE sollten Sie in der Lage sein zu verwenden genannten Gruppen . So versuchen (?P< name > regex ) für groupd Namensgebung und (?P= name ) als Rückreferenzierung.

Andere Tipps

Verwenden strsplit statt:

test <- "abcdefghijklmnop"
strsplit(test, "")[[1]][c(5, 7, 9, 10, 15)]

Es war mein Verständnis, dass 10 \ würden wir verstanden als Rückreferenzierung 0 durch eine Ziffer von 1 gefolgt Ich denke, 9 ist der max.

Die stri_replace_*_regex Funktionen aus dem stringi Paket nicht über solche Einschränkungen:

library("stringi")
stri_replace_all_regex("abcdefghijkl", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", "$10$1$11$12")
## [1] "jakl"

Wenn Sie die erste Capture-Gruppe mit 1 folgen wollen, verwenden Sie z.

stri_replace_all_regex("abcdefghijkl", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", "$10$1$1\\1$12")
## [1] "jaa1l"

Nach dieser Seite , zurück Referenzen \ 10 99 Arbeiten auf einige \ Sprachen, aber nicht die meisten.

Diejenigen, die gemeldet werden, arbeiten, sind

Diese Beschränkung auf 9 Rückreferenzierungen ist spezifisch für die sub() und gsub()functions, nicht auf Funktionen wie grep() und dergleichen. Unterstützung für mehr als 9 Rückreferenzierungen in R setzt die Verwendung PCRE regulären Ausdrucks (d.h. das Argument perl=TRUE); Aber auch mit dieser Option, die sub () und gsub () -Funktionen unterstützt es nicht.

Die R-Dokumentation ist in diesem Punkt eindeutig: siehe ?regexp

There can be more than 9 backreferences (but the replacement in sub can
only refer to the first 9).

Darüber hinaus die Idee der genannten Capture-Gruppen mit dieser Einschränkung zu umgehen, ist verpflichtet, da genannt Einfanggruppen mit sub () Funktionen nicht unterstützt werden, zum Scheitern verurteilt.

regexpr and gregexpr support ‘named capture’. If groups are named,
e.g., "(?<first>[A-Z][a-z]+)" then the positions of the matches are also
returned by name. (Named backreferences are not supported by sub.)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top