Plus de 9 références arrière dans gsub ()
Question
Comment utiliser gsub avec plus de 9 références arrières? Je m'attendrais à ce que le résultat de l'exemple ci-dessous soit "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"
La solution
Voir les Expressions régulières avec le langage R :
Vous pouvez utiliser les références arrières
\ 1
à\ 9
dans le texte de remplacement pour réinsérer le texte mis en correspondance par un groupe de capture . Il n'y a pas de jeton de texte de remplacement pour la correspondance globale. Placez la regex entière dans un groupe de capture, puis utilisez\ 1
.
Mais avec PCRE, vous devriez pouvoir utiliser les groupes nommés . Essayez donc (? P <
nom
>
regex
)
pour les noms groupd et (? P =
nom
)
en tant que référence arrière .
Autres conseils
Utilisez strsplit
à la place:
test <- "abcdefghijklmnop"
strsplit(test, "")[[1]][c(5, 7, 9, 10, 15)]
Je croyais comprendre que \ 10 correspondrait à la référence arrière 0 suivie du chiffre 1. Je pense que 9 est le maximum
Les fonctions stri_replace _ * _ regex
du package stringi ne sont pas soumises à de telles limitations:
library("stringi")
stri_replace_all_regex("abcdefghijkl", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", "$10$1$11$12")
## [1] "jakl"
Si vous souhaitez suivre le premier groupe de capture avec 1, utilisez par exemple
.stri_replace_all_regex("abcdefghijkl", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", "$10$1$1\\1$12")
## [1] "jaa1l"
Selon ce site , les références précédentes \ 10 à \ 99 fonctionnent sur certains langues, mais pas la plupart.
Ceux qui sont censés travailler sont
Cette limitation à 9 références arrière est spécifique aux fonctions sub ()
et gsub ()
, et non à des fonctions telles que grep ()
et le même. La prise en charge de plus de 9 références arrière dans R implique l'utilisation d'une expression régulière PCRE (c'est-à-dire l'argument perl = TRUE
); Cependant, même avec cette option, les fonctions sub () et gsub () ne la prennent pas en charge.
La documentation R est explicite sur ce point: voir ? regexp
There can be more than 9 backreferences (but the replacement in sub can
only refer to the first 9).
De plus, l'idée d'utiliser des groupes de capture nommés pour contourner cette limitation est vouée à l'échec car les groupes de capture nommés ne sont pas pris en charge par les fonctions 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.)