Più di 9 backreferenze in gsub ()
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"
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.)