1
votes

Détection des correspondances exactes à l'aide de str_detect () dans R

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?


5 commentaires

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


4 Réponses :


1
votes

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)


0 commentaires

1
votes

"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


0 commentaires

3
votes

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


0 commentaires

1
votes

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")


0 commentaires