2 votes

Comment remplacer une chaîne de caractères si le motif provient d'un vecteur ?

Je voudrais remplacer une partie d'une chaîne de caractères, mais je veux que la correspondance soit exacte. Dans le cas ci-dessous, je veux que ABC soit remplacé par mytag et non que A soit remplacé par mytag, etc.

mytags <- c("A","AB","ABC","B","BB","BBC","C","CB","CBC") 
x <- "I would like to replace ABC with mytag"
stri_replace_all_fixed(x,mytags,"mytag", vectorize_all=TRUE)

[1] "I would like to replace mytagBC with mytag" "I would like to replace mytagC with mytag"  "I 
would like to replace mytag with mytag"  
[4] "I would like to replace AmytagC with mytag" "I would like to replace ABC with mytag"     "I 
would like to replace ABC with mytag"    
[7] "I would like to replace ABmytag with mytag" "I would like to replace ABC with mytag"     "I 
would like to replace ABC with mytag"

Ce que j'aimerais obtenir est :

[1] "I would like to replace mytag with mytag"

3voto

akrun Points 148302

Ici, le motif a une longueur supérieure au vecteur. Donc, il va répliquer la longueur du motif. Au lieu de cela, nous pourrions créer un seul motif de chaîne de caractères en concaténant avec | sur str_c et l'utiliser pour remplacer chaque fois que l'un de ces motifs est trouvé.

library(stringr)
str_replace_all(x, str_c("\\b(", str_c(mytags, collapse="|"), ")\\b"), "mytag")
#[1] "I would like to replace mytag with mytag"

Ou une autre option est de passer un vecteur nommé

str_replace_all(x, setNames(rep("mytag", length(mytags)), 
       str_c("\\b", mytags, "\\b")))
#[1] "I would like to replace mytag with mytag"

Le mot limite ( \\b ) permet de s'assurer qu'il ne correspondra pas à une chaîne partielle au lieu d'un mot complet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X