Domanda

Come usare gsub con più di 9 riferimenti indietro? Mi aspetto che l'output nell'esempio seguente sia " 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"
È stato utile?

Soluzione

Vedi Espressioni regolari con il linguaggio R :

  

Puoi utilizzare le backreferenze da \ 1 a \ 9 nel testo sostitutivo per reinserire il testo corrispondente a gruppo di acquisizione . Non esiste un token di testo sostitutivo per la corrispondenza generale. Posiziona l'intera regex in un gruppo di acquisizione e quindi usa \ 1 .

Ma con PCRE dovresti essere in grado di utilizzare gruppi denominati . Quindi prova (?P<name> regex ) per la denominazione di groupd e (?P=name ) come riferimento .

Altri suggerimenti

Usa strsplit invece:

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

Ho capito che \ 10 avremmo capito come backreference 0 seguito da una cifra di 1. Penso che 9 sia il massimo.

Le funzioni stri_replace _ * _ regex dal pacchetto stringi non hanno tali limitazioni:

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

Se vuoi seguire il 1 ° gruppo di acquisizione con 1, usa ad esempio

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

Secondo questo sito , i riferimenti precedenti da 10 a 99 funzionano su alcuni lingue, ma non la maggior parte.

Quelli che sembrano funzionare sono

Questa limitazione a 9 backreferences è specifica delle funzioni sub () e gsub () , non a funzioni come grep () e il simile. Il supporto per più di 9 backreferenze in R implica l'uso dell'espressione regolare PCRE (ovvero l'argomento perl = TRUE ); tuttavia, anche con questa opzione, le funzioni sub () e gsub () non la supportano.

La documentazione R è esplicita su questo punto: vedi ?regexp

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

Inoltre, l'idea di utilizzare gruppi di acquisizione con nome per aggirare questa limitazione è destinata a fallire poiché i gruppi di acquisizione con nome non sono supportati con le funzioni sub ().

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.)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top