Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 01/10/2010, à 06:17

ehmicky

Problèmes regexps

Salut à tous,

Je recherche une regexp (type sed) pouvant correspondre à toute suite de caractères sauf si cette suite contient non pas un, ou l'un des caractères mais une suite précise de caractères donnée.
Exemple : toute suite de caractères ne contenant pas "abcde" :

Wabcdz    #Ok
Wabcd     #Ok
Wabded    #Ok
Wabcde    #Pas Ok

je recherche une regexp, pas une ligne de commande !

merci beaucoup ! smile


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#2 Le 01/10/2010, à 09:42

Totor

Re : Problèmes regexps

Bonjour,

pas moyen, t'es obligé de le faire en 2 fois.
style

grep 'W' fichier|grep -v 'Wabcde'

Dernière modification par Totor (Le 01/10/2010, à 10:02)


-- Lucid Lynx --

Hors ligne

#3 Le 01/10/2010, à 09:50

Postmortem

Re : Problèmes regexps

Salut,
je ne sais pas si c'est exactement ce que tu recherches mais je tente quand même :

$ cat test.txt 
Wabcdz    #Ok
Wabcd     #Ok
Wabded    #Ok
Wabcd e   #Ok
Wabcde    #Pas Ok
Wabcdef    #Pas Ok

$ sed 's/\(.*\)[!a][!b][!c][!d][!e]\(.*\)/\1\2/' test.txt
Wabcdz    #Ok
Wabcd     #Ok
Wabded    #Ok
Wabcd e   #Ok
W    #Pas Ok
Wf    #Pas Ok

La regexp serait donc : .*[!a][!b][!c][!d][!e].*


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#4 Le 01/10/2010, à 10:03

Totor

Re : Problèmes regexps

@Postmortem : si c'est bon


-- Lucid Lynx --

Hors ligne

#5 Le 01/10/2010, à 10:13

survietamine

Re : Problèmes regexps

bizarre :

cat test.txt | grep -E '.*[!a][!b][!c][!d][!e].*'
Wabcde		#Pas Ok
Wabcdef		#Pas Ok

Je crois qu'il voulait le résultat inverse, c'est à dire les autres lignes


Ðɸ Ƴơц ℕεєđ Şø₥€ √іêŤąɱίɳƸʂ ?

Hors ligne

#6 Le 01/10/2010, à 10:17

Totor

Re : Problèmes regexps

@survietamine :
un nouveau venu wink

award?v=cat&n=survitamie
http://partmaps.org/era/unix/award.html


sinon, si c'est bon, c'est bien la regex mais il faut inverser le résultat wink (grep -v)

Dernière modification par Totor (Le 01/10/2010, à 10:18)


-- Lucid Lynx --

Hors ligne

#7 Le 01/10/2010, à 10:28

survietamine

Re : Problèmes regexps

arf, j'avoue, en plus, souvent je le reproche aux collègues !

C'est parce que pour mes tests j'avais utilisé :

echo -e "Wabcdz\nWabcd\nWabded\nWabcde" | grep -E '[!a][!b][!c][!d][!e]'

mais ce n'est pas une excuse valable smile

Pour en revenir à la demande, je crois que la réponse est que ce n'est pas possible.
Votre regexp match les lignes 'pas ok' alors qu'il veut l'inverse.
Oui, avec grep/sed/awk et autres on peut inverser/supprimer les lignes qui correspondent.
Mais si j'ai compris, il n'en veut pas.
J'en ai déduis cela d'après sa phrase :

ehmicky a écrit :

je recherche une regexp, pas une ligne de commande !

Dernière modification par survietamine (Le 01/10/2010, à 10:30)


Ðɸ Ƴơц ℕεєđ Şø₥€ √іêŤąɱίɳƸʂ ?

Hors ligne

#8 Le 01/10/2010, à 10:51

Totor

Re : Problèmes regexps

arg, j'avais pas vu cette précision ! bien vu !
donc effectivement, y'a pas moyen


-- Lucid Lynx --

Hors ligne

#9 Le 01/10/2010, à 11:28

Postmortem

Re : Problèmes regexps

J'avais bien compris qu'il voulait récupérer tout ce qui n'était pas abcde, c'est pour ça que j'ai mis mon exemple sed pour récupérer ce qu'il y avait autour de abcde.
Avec grep, je me doutais bien que ça ne fonctionnait pas et d'ailleurs, faut remplacer les ! par ^ car ce n'était pas normal que ça ne sorte que 2 lignes (du moins, c'est pas ce que j'attendais !).
Mais de toute manière, grep -E '.*[^a][^b][^c][^d][^e].*' test.txt nous sortira forcément toutes les lignes sauf si celle-ci est exclusivement composée de abcde :

$ cat test.txt
Wabcdz    #Ok
Wabcd     #Ok
Wabded    #Ok
Wabcd e   #Ok
Wabcde    #Pas Ok
Wabcdef    #Pas Ok
abcde

$ grep -E '.*[^a][^b][^c][^d][^e].*' test.txt
Wabcdz    #Ok
Wabcd     #Ok
Wabded    #Ok
Wabcd e   #Ok
Wabcde    #Pas Ok
Wabcdef    #Pas Ok

En fait, faudrait le contexte quoi ! Du moins si c'est possible qu'une telle regexp existe !


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#10 Le 01/10/2010, à 11:36

Totor

Re : Problèmes regexps

oh là là ... je n'y suis pas ce matin hmm


-- Lucid Lynx --

Hors ligne

#11 Le 01/10/2010, à 11:55

survietamine

Re : Problèmes regexps

Postmortem a écrit :

J'avais bien compris qu'il voulait récupérer tout ce qui n'était pas abcde, c'est pour ça que j'ai mis mon exemple sed pour récupérer ce qu'il y avait autour de abcde.
Avec grep, je me doutais bien que ça ne fonctionnait pas et d'ailleurs, faut remplacer les ! par ^ car ce n'était pas normal que ça ne sorte que 2 lignes (du moins, c'est pas ce que j'attendais !).
Mais de toute manière, grep -E '.*[^a][^b][^c][^d][^e].*' test.txt nous sortira forcément toutes les lignes sauf si celle-ci est exclusivement composée de abcde :

Oui, j'avais essayé aussi avec ^.
Ce que je n'ai pas encore compris, c'est pourquoi, j'ai une ligne qui passe à la trappe :

$ echo -e "Wabcdz\nWabcd\nWabded\nWabcde" | grep -E '.*[^a][^b][^c][^d][^e].*'
Wabcdz
Wabcd
Wabcde

Dernière modification par survietamine (Le 01/10/2010, à 11:56)


Ðɸ Ƴơц ℕεєđ Şø₥€ √іêŤąɱίɳƸʂ ?

Hors ligne

#12 Le 01/10/2010, à 12:19

Postmortem

Re : Problèmes regexps

En fait, j'ai dit une connerie là :

Postmortem a écrit :

Mais de toute manière, grep -E '.*[^a][^b][^c][^d][^e].*' test.txt nous sortira forcément toutes les lignes sauf si celle-ci est exclusivement composée de abcde

grep -E '.*[^a][^b][^c][^d][^e].*' test.txt, ça matche toutes les lignes sauf celles qui sont composées de 5 caractères ET (qui ont un a en 1ère position ou un b en 2ème ou un c en 3ème ou un d en 4ème ou un e en 5ème) :

echo -e "Wabcdz\nWabcd\nWabded\nWabcde\nabcdef\nWcdee\na2345\n1b345\n1b3456" | grep -E '[^a][^b][^c][^d][^e]'
Wabcdz
Wabcd
Wabcde
abcdef
1b3456

En clair, je me demande bien si on a aidé ehmicky dans l'histoire ! hmm

Dernière modification par Postmortem (Le 01/10/2010, à 12:21)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#13 Le 01/10/2010, à 12:23

survietamine

Re : Problèmes regexps

Postmortem a écrit :

En clair, je me demande bien si on a aidé ehmicky dans l'histoire ! hmm

T'as raison, il me semble m'être déjà posé la même question que lui à plusieurs reprises.
Et donc, j'avais un peu parcouru le web.
Je ne me souviens pas avoir trouvé une solution adéquate en regexp pure.
Il me semble que les regexp, c'est mieux pour correspondre (match).
C'est peut-être pour ça qu'il y a '-v' dans grep ou équivalent dans d'autres outils.
Je ne sais pas dans quel langage il développe (perl, php, python etc...) mais je pense qu'il peut faire l'équivalent.

Dernière modification par survietamine (Le 01/10/2010, à 12:24)


Ðɸ Ƴơц ℕεєđ Şø₥€ √іêŤąɱίɳƸʂ ?

Hors ligne

#14 Le 01/10/2010, à 12:31

Postmortem

Re : Problèmes regexps

Puis zut, d'habitude Totor nous sauve !! big_smile
Peut-être qu'après le week-end, il retrouvera ses capacités !!!!


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#15 Le 01/10/2010, à 17:32

ehmicky

Re : Problèmes regexps

Ouh là là que de réponses, je vais regarder tout ça !
Pour la réponse avec une suite de [^ ], il y a un problème je crois, mais je regarde !

Edit : Ok, donc je viens de regarder. Le problème avec la suite de [^ ], c'est que faut que par exemple pour :

.*[^a][^b][^c][^d][^e].*

Chaque [^ ] doit "matcher" une lettre (ce n'est pas facultatif), donc du coup une ligne avec moins de 5 caractères ne peut pas correspondre à cette regexp.
Par ailleurs, '.*' permet tout caractère. Donc par exemple une ligne telle que "ooooooabcdeoooooo" ne serait pas filtrée par cette regexp, parceque "ooooooabcdeo" corresponderait à ".*" et les derniers "ooooo" à "[^a][^b][^c][^d][^e]"

Récapitulatif : oui cela n'a pas l'air de marcher.
Pour la question des points d'exclamation, ils ne marchent que pour le globbing. Dans une regexp, cela signifiait simplement un '!' littéral, c'est pour ça que ça marchait pas.

Edit2 : Je vois vraiment pas de solution, je pense que Totor a raison en disant qu'il n'y en a pas, et qu'on est obligé d'utiliser une commande inversant la sélection.
J'ai cherché au-delà des regexps avec le globbing étendu mais ça aide pas plus. Je connais pas Perl, mais je crois que les regexps sont plus évoluées, donc je sais pas si ça se résolverait ainsi... (si quelqu'un connaît Perl)

Dernière modification par ehmicky (Le 01/10/2010, à 18:15)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#16 Le 01/10/2010, à 18:14

Postmortem

Re : Problèmes regexps

Si c'est pour virer toutes les lignes contenant abcde alors :

sed -n '/abcde/!p' <<< $'abcdedfgqsgd\naokhfez\nabcdye\naeabcdesddf\nbd'

Si non, moi pas voir ce que toi veut faire !!

Dernière modification par Postmortem (Le 01/10/2010, à 18:14)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#17 Le 01/10/2010, à 18:17

ehmicky

Re : Problèmes regexps

sed '/abcde/ d' <<< $'abcdedfgqsgd\naokhfez\nabcdye\naeabcdesddf\nbd'

aussi.

En fait, c'est pas dans un but précis, c'est juste une question générale sur les regexps, parce que je suis à chaque fois confronté à cette question.
La question initiale est : une regexp (et non une commande utilisant les regexps comme grep, sed, awk, etc.) symbolisant toute suite de caractères, à condition que celle-ci ne comprenne pas une séquence précise de caractères.

Mais je crois que y'a pas de solution en fait. Dans la pratique, ça signifie être obligé d'utiliser les méthodes d'inversions des commandes grep -v, sed 'd', etc.

Dernière modification par ehmicky (Le 01/10/2010, à 18:21)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#18 Le 01/10/2010, à 19:49

sputnick

Re : Problèmes regexps

Il faut voir les look ahead et les look behind dans pcre et perl.

Exemple :

sputnick@FreAkyLab:~$ pcregrep '(?<!text)foo' <<< textfoo
sputnick@FreAkyLab:~|ERROR:1|$ pcregrep '(?<!text)foo' <<< basefoo
basefoo
sputnick@FreAkyLab:~$

edit: CF => http://www.regular-expressions.info/lookaround.html

Dernière modification par sputnick (Le 01/10/2010, à 19:51)


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#19 Le 07/10/2010, à 00:46

sputnick

Re : Problèmes regexps

Ca marche aussi avec grep -P si cette option est supporté (semble le défaut sous Lucid)


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne