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"
Était-ce utile?

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.)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top