IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Soucis de regex


Sujet :

Python

  1. #1
    Membre éclairé Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut Soucis de regex
    Bonjour à tous!

    Encore débutant sur Python, j'essaie de détruire tous les fichiers d'un répertoire dont le nom termine par '.cfg'.

    J'ai testé ceci en m'inspirant de la doc python:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    >>> import os
    >>> import re
    >>> prog = re.compile("cfg")
    >>> for f in os.listdir('/home/moi/Desktop'):
    ...     if prog.match(f):
    ...             print f,"yes"
    ...     else:
    ...             print f,"non"
    J'obtiens ceci en sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    hosts-paris.cfg non
    config-paris.conf non
    sixth.py non
    hosts-reims.cfg non
    hostgroup.cfg non
    Je ne comprends pas pourquoi le nom du fichier ne matche jamais la regex? Est-ce que je me suis trompé dans la regex à compiler?

    Merci de votre aide!!

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Citation Envoyé par Balbuzard Voir le message
    Je ne comprends pas pourquoi le nom du fichier ne matche jamais la regex? Est-ce que je me suis trompé dans la regex à compiler?
    Utilisez plutôt rg = re.compile('.*.cfg') et si vous êtes faché avec les regexp regardez le module glob
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Moi, je préfère le module fnmatch:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    import os
    import fnmatch
    for f in os.listdir('/home/moi/Desktop'):
        if fnmatch.fnmatch(f, "*.cfg"):
            print f,"yes"
        else:
            print f,"non"
    Tyrtamos

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Utilisez plutôt rg = re.compile('.*.cfg') et si vous êtes faché avec les regexp regardez le module glob
    - W
    je pense qu'il y a une toute petite erreur, je me permets de la corriger:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rg = re.compile('.*\.cfg')

  5. #5
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut regexp ? pourquoi ici ?
    Bonsoir,

    Je ne comprend pas, vous avez tout sous la main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    import os
    rep = os.path.join(os.path.expanduser('~'), 'Bureau')
    # 'Bureau' pour moi > a remplacer par 'Desktop'.
    # os.path.expanduser('~') pour le home de l'utilisateur : Universel.
    for f in os.listdir(rep):
        if os.path.splitext(f)[1].lower() == '.cfg':
        # tutu.cfg > ('tutu', '.cfg')
        # .lower() pour les minuscules
            print(os.path.join(rep, f), 'yes')
            # Vu que c'est pour un delete... os.path.join(rep, f) au cas ou...
            # print() pour Python 3 > compatible 2.x.
        else:
            print(os.path.join(rep, f), 'non')
    # Soit :
    #for f in os.listdir(rep):
    #    if os.path.splitext(f)[1].lower() == '.cfg':
    #        os.remove(os.path.join(rep, f))
    # Ou :
    #for f in (f for f in os.listdir(rep) if os.path.splitext(f)[1].lower() == '.cfg'):
    #    os.remove(os.path.join(rep, f))
    Pourquoi chercher plus loin ? Inutile non ?

    Bon code

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Pour ce qui est de glob ce n'est qu'un 'outils' utilisant os/yield/re/fnmatch.
    Du moment ou l'on connais les modules en question et que l'on a compris yield je n'en vois pas l'utilité.
    Mieux : du moment ou l'on sais ce que l'on veux faire il est largement préférable de s'en passer pour aller directement au but.
    Ceci dit l'étude du code de glob.py peux être un bon apprentissage à la découverte de l'exploration d'un système de fichier.

    @+

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Salut,

    Il y a toujours plusieurs façons de réaliser une fonction.

    Mais quand la fonctionnalité est déjà réalisée par un module standard, soit on l'ignore et c'est dommage, soit on explique pourquoi il est intéressant, dans ce cas, d'écrire plus de lignes de code.
    Cela donne un critère pour mesurer pourquoi "on préfère" plutôt que de rester sur du subjectif.

    - W
    pour "os.path.splitext(f)[1].lower() == '.cfg'"
    Désolé, mais je trouve cela très "beurk"
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Citation Envoyé par kango Voir le message
    je pense qu'il y a une toute petite erreur, je me permets de la corriger:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rg = re.compile('.*\.cfg')
    Oops, merci
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre éclairé Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut
    Merci à tous pour vos réponses!

    Elles m'ont permis de résoudre mon soucis.

    La réponse de wiztricks m'a est cele que je cherchais en premier, mais j'ai finalement préféré celle de PauseKawa qui évite d'utiliser le module re.

    Merci encore

    Bonne journée!

  10. #10
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    Citation Envoyé par wiztricks Voir le message
    Salut,

    Il y a toujours plusieurs façons de réaliser une fonction.

    Mais quand la fonctionnalité est déjà réalisée par un module standard, soit on l'ignore et c'est dommage, soit on explique pourquoi il est intéressant, dans ce cas, d'écrire plus de lignes de code.
    Cela donne un critère pour mesurer pourquoi "on préfère" plutôt que de rester sur du subjectif.

    - W
    pour "os.path.splitext(f)[1].lower() == '.cfg'"
    Désolé, mais je trouve cela très "beurk"
    La démonstration viens d'être faite wiztricks.
    Citation Envoyé par Balbuzard Voir le message
    j'essaie de détruire tous les fichiers d'un répertoire dont le nom termine par '.cfg'.
    Citation Envoyé par wiztricks Voir le message
    et si vous êtes faché avec les regexp regardez le module glob
    Citation Envoyé par PauseKawa Voir le message
    Du moment ou l'on connais les modules en question ...
    Mieux : du moment ou l'on sais ce que l'on veux faire il est largement préférable de s'en passer pour aller directement au but.
    glob (module + ses imports) ou os.path.splitext ?

    Pour le beurk :
    C'est vrais que cela arrache la rétine.
    Toutefois comme f viens d'un os.listdir :
    os.path.splitext(path)

    Split the pathname path into a pair (root, ext) such that root + ext == path, and ext is empty or begins with a period and contains at most one period. Leading periods on the basename are ignored; splitext('.cshrc') returns ('.cshrc', '').
    Donc if os.path.splitext(f)[1] == ... Ok.
    Pour le lower c'est de dernière minute.
    Dans l'attente de vous lire à ce sujet.

    @+

  11. #11
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour Balbuzard,

    J'ai fais des tests pour un autre sujet et il s'avère qu'il faut savoir rester simple.
    Soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import os
    rep = os.path.join(os.path.expanduser('~'), 'Bureau')
    delfic = os.remove
    joinpath = os.path.join
    splitname = os.path.splitext
    for f in os.listdir(rep):
        if splitname(f)[1] == '.cfg':
            delfic(joinpath(rep, f))
    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Souci de Regex
    Par ApocalypseDuck dans le forum Langage
    Réponses: 5
    Dernier message: 10/04/2009, 16h45
  2. soucis de regex
    Par Miaou le chat thon dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 10/12/2008, 15h32
  3. [RegEx] Souci des regex pour les puces donc erreurs W3C
    Par retour dans le forum Langage
    Réponses: 10
    Dernier message: 04/10/2008, 15h09
  4. Soucis avec regex.replace
    Par elric47 dans le forum ASP
    Réponses: 1
    Dernier message: 29/04/2008, 23h33
  5. [REGEX] Souci de regex
    Par LE NEINDRE dans le forum Langage
    Réponses: 5
    Dernier message: 27/02/2006, 09h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo