2 votes

r : regex pour contenir un motif avec négation

Supposons que j'ai les deux chaînes suivantes et que je souhaite utiliser grep pour voir ce qui correspond :

business_metric_one
business_metric_one_dk
business_metric_one_none
business_metric_two
business_metric_two_dk
business_metric_two_none

Et ainsi de suite pour divers autres paramètres. Je veux seulement faire correspondre le premier de chaque groupe ( business_metric_one y business_metric_two et ainsi de suite). Ils ne sont pas dans une liste ordonnée, je ne peux donc pas les indexer et je dois utiliser la méthode suivante grep . Au début, je pensais le faire :

.*metric.*[^_dk|^_none]$

Mais cela ne semble pas fonctionner. Avez-vous des idées ?

2voto

Wiktor Stribiżew Points 100073

Vous devez utiliser un motif PCRE pour filtrer le vecteur de caractères :

x <- c("business_metric_one","business_metric_one_dk","business_metric_one_none","business_metric_two","business_metric_two_dk","business_metric_two_none")
grep("metric(?!.*_(?:dk|none))", x, value=TRUE, perl=TRUE)
## => [1] "business_metric_one" "business_metric_two"

Voir le R démo

En metric(?!.*(?:_dk|_none)) le motif correspond

  • metric - a metric sous-chaîne
  • (?!.*_(?:dk|none)) - qui n'est pas suivi de caractères 0+ autres que les caractères de retour à la ligne suivis de _ et ensuite soit dk ou none .

Voir le Démonstration de regex .

REMARQUE : si vous devez faire correspondre uniquement les valeurs qui contiennent metric et ne se terminent pas par _dk o _none utiliser une variante, metric.*$(?<!_dk|_none) où le (?<!_dk|_none) Le lookbehind négatif fait échouer la correspondance si la chaîne se termine soit par _dk o _none .

0voto

avid_useR Points 11344

Vous pouvez aussi faire quelque chose comme ça :

grep("^([[:alpha:]]+_){2}[[:alpha:]]+$", string, value = TRUE)
# [1] "business_metric_one" "business_metric_two"

ou utiliser grepl pour correspondre dk y none puis annulez la logique lorsque vous indexez l'original. string :

string[!grepl("(dk|none)", string)]
# [1] "business_metric_one" "business_metric_two"

de manière plus concise :

string[!grepl("business_metric_[[:alpha:]]+_(dk|none)", string)]
# [1] "business_metric_one" "business_metric_two"

Données :

string = c("business_metric_one","business_metric_one_dk","business_metric_one_none","business_metric_two","business_metric_two_dk","business_metric_two_none")

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