J'ai une chaîne dans R:
str_detect(string, "FLT1") [1] TRUE TRUE TRUE TRUE
Je veux conserver toutes les correspondances qui ont FLT1 mais pas lorsque d'autres caractères alphanumériques sont ajoutés. En d'autres termes, je veux conserver toutes les entrées sauf la seconde, car elles mentionnent toutes FLT1, mais la seconde mentionne FLT1P1.
Quand j'utilise str_detect, il renvoie tout comme vrai: p >
c("FLT1", "FLT1P1", "FLT1-FLT2", "SGY-FLT1, GPD")
Quelqu'un peut-il vous conseiller sur la meilleure méthode pour ne renvoyer que les éléments qui mentionnent FLT1?
4 Réponses :
Utilisez look arounds
library(stringr) x <- c("FLT1", "FLT1P1", "FLT1-FLT2", "SGY-FLT1, GPD","AFLT1") x %>% str_detect("(?<![:alpha:])FLT1(?![:alpha:])") #> [1] TRUE FALSE TRUE TRUE FALSE
Créé le 17/06/2020 par le paquet reprex (v0.3.0)
"Aucun autre caractère ajouté" signifie pour moi la limite du mot qui est exprimée par \\b
.
grepl("FLT1\\b", x) # [1] TRUE FALSE TRUE TRUE
Ou base R:
x <- c("FLT1", "FLT1P1", "FLT1-FLT2", "SGY-FLT1, GPD") stringr::str_detect(x, "FLT1\\b") # [1] TRUE FALSE TRUE TRUE
Probablement les limites de mots avec \\ b
fonctionneront. Ils correspondent au début ou à la fin des chaînes et à la transition vers / depuis tout caractère autre qu'un chiffre, une lettre ou un trait de soulignement.
str_detect(string, "\\bFLT1\\b") [1] TRUE FALSE TRUE TRUE
Le meilleur moyen est d'utiliser \\ b
, comme indiqué par d'autres.
Vous pouvez également utiliser une anticipation positive:
Données:
grep("FLT1(?!\\w)", x, perl = T, value = T) [1] "FLT1" "FLT1-FLT2" "SGY-FLT1, GPD"
Solution:
grep("FLT1(?=$|-|,)", x, perl = T, value = T) [1] "FLT1" "FLT1-FLT2" "SGY-FLT1, GPD"
Ici, grep
correspond à FLT1
si , et seulement si, la chose immédiatement suivante est soit la fin de la chaîne ( $
), soit -
ou ,
. Par implication, il ne correspond pas lorsque le caractère immédiatement suivant est, par exemple, alphanumérique.
Ou, si la règle est que vous souhaitez exclure des valeurs où des caractères alphanumériques sont ajoutés, vous pouvez utiliser à exclure lookahead:
x <- c("FLT1", "FLT1P1", "FLT1-FLT2", "SGY-FLT1, GPD")
vous pouvez ancrer votre regex
N'utilisez pas de regex pour les correspondances exactes de chaînes complètes.
string == "FLT1"
Si j'utilise la chaîne == "FLT1", il manque des entrées telles que "FLT1-FLT2"
D'accord, donc quand vous utilisez "mais pas quand d'autres caractères sont ajoutés" , il semble que vous n'incluez pas
"-"
dans votre définition de caractère. Voulez-vous dire "mais pas quand d'autres lettres" sont ajoutées? "... pas d'autres lettres et chiffres"? "Quelque chose d'autre que" - "? Quelque chose d'autre?vous pouvez essayer
str_detect (string, "FLT1 (\\ W | $)")
, en ne spécifiant aucun caractère alphanum (c'est-à-dire un caractère qui n'est pas alphanumérique ou la fin de la chaîne) après FLT1