Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Général Python
Général Python Forum d'entraide sur les fondamentaux du langage Python, syntaxe, POO, bibliothèque standard, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 16/01/2013, 00h04   #1
florent
Candidat au titre de Membre du Club
 
Inscription : mars 2002
Messages : 49
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 49
Points : 14
Points : 14
Par défaut [REGEX] petit soucis ..

Bonjour,

j'ai un soucis avec mon expression régulière :
Code :
1
2
 
^(.*)\.s?(\d{1,2})[ex]?(\d{2})\.
sur une valeur telle "How.I.Met.Your.Mother.8x16.FR.CaR.zip"

cela me sort
=> How.I.Met.Your.Mother
=> 8
=> 16

C'est parfait !
Mais probleme avec "How.I.Met.Your.Mother.8x12.8x13.FR.CaR.zip"
=> How.I.Met.Your.Mother.8x12
=> 8
=> 13

j'ai donc fait évoluer ma regex :
Code :
^(.*)\.s?(\d{1,2})[ex]?(\d{2})\.(?:\d{1}x\d{2}\.)?
Mais le problème persiste ... et je sèche

Un petit lien si vous voulez vous y essayer
http://regexr.com?33dt1

Merci
florent est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2013, 00h12   #2
florent
Candidat au titre de Membre du Club
 
Inscription : mars 2002
Messages : 49
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 49
Points : 14
Points : 14
Arf j'ai finalement trouvé une regex qui fonctionne

Code :
^(.*[^s?\d{1,2}(x|e)?\d{2}])\.s?(\d{1,2})[ex]?(\d{2})\.(?:s?(\d{1,2})[ex]?(\d{2})\.)?
florent est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2013, 09h09   #3
mont29
Membre Expert
 
Homme Bastien Montagne
Diverses et multiples
Inscription : mai 2008
Messages : 620
Détails du profil
Informations personnelles :
Nom : Homme Bastien Montagne
Localisation : France

Informations professionnelles :
Activité : Diverses et multiples

Informations forums :
Inscription : mai 2008
Messages : 620
Points : 1 029
Points : 1 029
Désolé, mais cette regex ne fait certainement pas ce que tu veux (pas en python, en tout cas*!). Le contenu des classes de caractères (entre crochets []) a sa propre syntaxe, la syntaxe regex “normale” n’y a pas cours… Autrement dit, "[^s?\d{1,2}(x|e)?\d{2}]" signifie «*tout sauf un s, un ?, un \, un d, un {, etc.*»*!

Ce que tu cherches à faire, c’est un lookahead négatif, mais tu n’en a pas besoin ici, amha un simple opérateur non-glouton devrait suffire*:

Code :
"^(.*?)\.s?(\d{1,2})[ex]?(\d{2})\.(?:\d{1}x\d{2}\.)?"
Alors que "(.*)" signifie «*capturer autant de caractère que possible tant que le reste de la regex est satisfaite*» (opérateur glouton), "(.*?)" signifie «*capturer le minimum de caractères nécessaires afin de satisfaire le reste de la regex*» (opérateur non-glouton, obtenu par l’ajout du “?” supplémentaire)*!
__________________
Incantation : Méchant forum, arrête de transformer toutes mes espaces insécables en astérisques
mont29 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/01/2013, 00h46   #4
florent
Candidat au titre de Membre du Club
 
Inscription : mars 2002
Messages : 49
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 49
Points : 14
Points : 14
Tu as complétement raison Bastien !

Comment j'ai pu passé à côté de ça et me compliquer autant la vie

Passé une certaine heure, il vaut mieux reporter au lendemain

Merci
florent est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2013, 11h03   #5
ripat
Membre Expert
 
Inscription : mai 2004
Messages : 768
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 768
Points : 1 080
Points : 1 080
Citation:
Envoyé par mont29 Voir le message
Ce que tu cherches à faire, c’est un lookahead négatif, mais tu n’en a pas besoin ici, amha un simple opérateur non-glouton devrait suffire*:

Code :
"^(.*?)\.s?(\d{1,2})[ex]?(\d{2})\.(?:\d{1}x\d{2}\.)?"
Un multiplicateur non gourmand peut toujours être avantageusement remplacé par une classe négative. Souvent plus véloce.

Code :
^([^\d]+)\.(\d{1,2})[ex]?(\d{2})
Dans ce cas-ci et avec l'exemple donné: de 60% à deux fois plus rapide d'après timeit().
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2013, 09h17   #6
mont29
Membre Expert
 
Homme Bastien Montagne
Diverses et multiples
Inscription : mai 2008
Messages : 620
Détails du profil
Informations personnelles :
Nom : Homme Bastien Montagne
Localisation : France

Informations professionnelles :
Activité : Diverses et multiples

Informations forums :
Inscription : mai 2008
Messages : 620
Points : 1 029
Points : 1 029
Certes… mais cette regex est moins universelle, elle bloquera complètement (pas de match) sur "How.I.Met.Your.Mother.At.6PM.8x16.FR.CaR.zip", par exemple. Donc, il n’y a que deux possibilités, amha*: opérateur non-glouton, ou lookahead négatif (ce qui doit, je pense, revenir au même…). Pas testé les performances, mais l’opérateur non-glouton est bien plus simple à écrire (et à comprendre*!).
__________________
Incantation : Méchant forum, arrête de transformer toutes mes espaces insécables en astérisques
mont29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h15.


 
 
 
 
Partenaires

Hébergement Web