Recherche dans une chaine de caractères - grep

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Séverine Bayle
Messages : 31
Enregistré le : 02 Oct 2014, 16:15

Recherche dans une chaine de caractères - grep

Messagepar Séverine Bayle » 26 Avr 2017, 13:31

Bonjour,

Je dois identifier dans un data frame toutes les lignes dont la description de la variable 'libelle' contient le mot 'test', écrit de différentes manières et situé à n'importe quel endroit de la chaine de caractère. Pour cela, j'ai écrit :

x <- grep(c('(test)','(Test)','(Test_)','(TEST)','(TEST$)'),mon_dataframe$libelle)

Malheureusement, cette fonction ne me récupère pas toutes les lignes concernées...

Les lignes dont la description du libellé commence par 'test' sont bien identifiées, mais pas celles commençant par 'Test', ni celles commençant par 'Test_' et ayant un caractère juste après le _ ....

Savez-vous comment faire? Est-il possible de demander comme je l'ai fait à la fonction grep d'identifier plusieurs expressions à la fois, ou dois-je écrire une ligne de commande pour chaque expression?

Merci par avance pour votre aide.

Séverine

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Recherche dans une chaine de caractères - grep

Messagepar Pierre-Yves Berrard » 26 Avr 2017, 14:00

Bonjour,

L'argument pattern de grep attend une expression régulière, pas un vecteur :

Code : Tout sélectionner

pattern = "^(test|Test|Test_|TEST|TEST$)"
PY

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Recherche dans une chaine de caractères - grep

Messagepar Logez Maxime » 26 Avr 2017, 14:05

Bonjour,

tu peux encore simplifier l'expression régulière par :

Code : Tout sélectionner

x <- grep("test_?", mon_dataframe$libelle, ignore.case = TRUE)
Cordialement,
Maxime

Séverine Bayle
Messages : 31
Enregistré le : 02 Oct 2014, 16:15

Re: Recherche dans une chaine de caractères - grep

Messagepar Séverine Bayle » 26 Avr 2017, 14:28

Merci beaucoup Pierre-Yves!

Séverine Bayle
Messages : 31
Enregistré le : 02 Oct 2014, 16:15

Re: Recherche dans une chaine de caractères - grep

Messagepar Séverine Bayle » 26 Avr 2017, 14:28

Merci pour le tuyau Maxime, je vais tester :)

Séverine Bayle
Messages : 31
Enregistré le : 02 Oct 2014, 16:15

Re: Recherche dans une chaine de caractères - grep

Messagepar Séverine Bayle » 26 Avr 2017, 15:00

Une dernière petite question : vos deux propositions ne me donnent pas tout à fait la même chose... En effet, j'ai des lignes détectées par l'expression de Maxime qui ne le sont pas par l'expression de Pierre-Yves (notamment ce qui concerne 'Test').

Pouvez-vous m'expliquer pourquoi?

Merci :)

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Recherche dans une chaine de caractères - grep

Messagepar Logez Maxime » 26 Avr 2017, 19:19

Bonjour,

Il faudrait que tu donnes un exemple de chaînes détectées par l'une des méthodes et pas l'autre pour qu'on te donne plus d'explications.

Cordialement,
Maxime

Séverine Bayle
Messages : 31
Enregistré le : 02 Oct 2014, 16:15

Re: Recherche dans une chaine de caractères - grep

Messagepar Séverine Bayle » 27 Avr 2017, 08:17

Voici un exemple : avec la méthode de Pierre-Yves, j'ai un libellé tel que 'DIT - Test 1 abo' qui ne sont pas détectés, alors que ta méthode Maxime la repère. Et je ne comprends pas pourquoi...

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Recherche dans une chaine de caractères - grep

Messagepar Pierre-Yves Berrard » 27 Avr 2017, 08:23

C'est à cause du circonflexe au début de mon expression régulière qui indique que les chaînes recherchées doivent commencer par "test".
(je croyais que vous connaissiez puisque vous avez utilisé le dollar qui indique une fin de chaîne)
PY

Séverine Bayle
Messages : 31
Enregistré le : 02 Oct 2014, 16:15

Re: Recherche dans une chaine de caractères - grep

Messagepar Séverine Bayle » 27 Avr 2017, 08:57

Merci pour votre réponse. Je viens de tester et c'est bien cela qui me posait problème. Je ne connais pas trop les expressions régulières, je débute :)

Bonne journée,

Séverine

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Recherche dans une chaine de caractères - grep

Messagepar Pierre-Yves Berrard » 27 Avr 2017, 09:09

Du coup, supprimez le dollar, si c'était une faute de frappe.
Ou si vous voulez détecter le signe dollar, échappez-le avec \\$.
PY

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: Recherche dans une chaine de caractères - grep

Messagepar Eric Casellas » 27 Avr 2017, 10:20

Bonjour,

Séverine Bayle a écrit : Je ne connais pas trop les expressions régulières

Je trouve ces site pratique pour mettre au point et se familiariser avec les expression regulière :
https://regex101.com/ http://www.regexr.com/

Sinon pour revenir à R et la recherche de caractères (sans expression régulière) je voulais signaler la fonction %in% qui permet de tester la présence à partir d'un vecteur de valeurs...

Code : Tout sélectionner

?'%in%'
Eric

Ludovic Hinlu
Messages : 5
Enregistré le : 27 Avr 2017, 10:04

Re: Recherche dans une chaine de caractères - grep

Messagepar Ludovic Hinlu » 27 Avr 2017, 14:47

Salut !

D'après moi, il y a également une méthode sans utiliser la fonction grep, si tes 4 premières lettres sont toujours T, e, s, et t

Si ton jeu de données est A, et "libelle" le nom de la variable de tri :

LIBELLE <- toupper(A[,"libelle"])
Atri <- A[which(substr(LIBELLE,1,4)=="TEST"),] #créera la matrice Atri qui contient les lignes de A dont la variable "libelle" commence par test

Bien sur, tu peux simplifier en une seule ligne, mais l'idée est là ;)

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Recherche dans une chaine de caractères - grep

Messagepar Logez Maxime » 27 Avr 2017, 20:43

Bonjour,

Ludovic Hinlu a écrit :Salut !

D'après moi, il y a également une méthode sans utiliser la fonction grep, si tes 4 premières lettres sont toujours T, e, s, et t

Si ton jeu de données est A, et "libelle" le nom de la variable de tri :

LIBELLE <- toupper(A[,"libelle"])
Atri <- A[which(substr(LIBELLE,1,4)=="TEST"),] #créera la matrice Atri qui contient les lignes de A dont la variable "libelle" commence par test

Bien sur, tu peux simplifier en une seule ligne, mais l'idée est là ;)
Il me semble que ce code était trop restrictif par rapport à la question :
les lignes dont la description de la variable 'libelle' contient le mot 'test', écrit de différentes manières et situé à n'importe quel endroit de la chaine de caractère
En général les expressions régulières sont plus efficaces que les autres manipulations sur les chaînes de caractères.

Cordialement,
Maxime

Stéphane Laurent
Messages : 1557
Enregistré le : 05 Déc 2006, 19:07

Re: Recherche dans une chaine de caractères - grep

Messagepar Stéphane Laurent » 27 Avr 2017, 21:02

Séverine Bayle a écrit :Je ne connais pas trop les expressions régulières


Moi non plus. Le "cheatsheet" sur les expressions régulières peut être utile (vers le bas de la page): https://www.rstudio.com/resources/cheatsheets/
Et pour certains trucs, il est plus simple d'utiliser les fonctions du package stringr.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité