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 :

Comment faire re.search avec une variable qui retourne le caractère ' ? [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Par défaut Comment faire re.search avec une variable qui retourne le caractère ' ?
    Bonjour à tous,


    Après avoir parcouru quelques documentation sur le module re et les exemples fourni sur le net je sèche sur la réutilisation d'une variable qui contient le caractère ' au milieu de la chaine de caractère.

    Voici les différents éléments retourné et ce que j'ai tenté. Les lignes commentée sont les retours obtenu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    liste = WAPT.list('hugo-7zip')
    print liste
    # [PackageEntry('hugo-7zip','18.1.0.0-3') architecture=x64]
    En tentant en remplaçant manuellement le caractère spécial cela fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        regex=re.compile(',\'(.*)\'\)',re.I) #re.I permet d'ignorer la case (majuscule/minuscule)
        version=regex.search('[PackageEntry(\'hugo-7zip\',\'18.1.0.0-3\') architecture=x64]')
        #version=regex.search(liste)
        if version:
            print version.group(1) # le groupe 1 correspond à '.*'
    En indiquant la variable retour directement dans le code précédent (ligne commentée) j'ai le retour erreur suivant
    version=regex.search(liste)
    TypeError: expected string or buffer
    J'ai également tenté d'insérer des backslash dans la chaine mais cette fois ci il n'y a aucune tentative de remplacement de texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        str = "[PackageEntry('hugo-7zip','18.1.0.0-3') architecture=x64]"
        new_str = str.replace('\'', '\\\'')
        print new_str
     
     
        #WAPT.list('hugo-7zip')
        #[PackageEntry('hugo-7zip','18.1.0.0-3') architecture=x64]
        regex=re.compile(',\'(.*)\'\)',re.I) #re.I permet d'ignorer la case (majuscule/minuscule)
        #version=regex.search('[PackageEntry(\'hugo-7zip\',\'18.1.0.0-3\') architecture=x64]')
        version=regex.search(new_str)
        if version:
            print version.group(1) # le groupe 1 correspond à '.*'
    Tout me semble correct mais à l'évidence ça ne l'est pas... d'où mon appel à l'aide.

    En vous remerciant d'avance pour le temps passé

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 717
    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 717
    Par défaut
    Salut,

    Si on résume, vous travaillez sous Python2.7 et vous avez le soucis suivant:
    Une chaîne de caractères contenant des "'":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> s = "[PackageEntry('hugo-7zip','18.1.0.0-3') architecture=x64]"
    Une regex qui cherche le pattern ,'*':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> regex=re.compile(',\'(.*)\'\)',re.I)
    J'essaie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> regex.search(s)
    <_sre.SRE_Match object at 0x02212E20>
    >>> _.groups()
    ('18.1.0.0-3',)
    >>>
    oops, çà marche: qu'est ce que j'ai oublié?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Par défaut
    Arghh... en effet, j'avais réutilisé la variable new_str qui était mise en place pour que je trouve les blocages.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        str = "[PackageEntry('hugo-7zip','18.1.0.0-3') architecture=x64]"
        new_str = str.replace('\'', '\\\'')
    Par contre quand je refait ma tentative avec une fonction que je n'ai pas la possibilité de modifier le problème persiste. Peut être que le problème viens dont la valeur est stockée ? Peut être que ce n'est pas une véritable chaine de caractère. Pourtant que je fait afficher le résultat il me semble identique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        import re
        liste = WAPT.list('hugo-7zip')
        print liste #pour visionner le retour de la fonction
        #[PackageEntry('hugo-7zip','18.1.0.0-3') architecture=x64]
     
        regex=re.compile(',\'(.*)\'\)',re.I) #re.I permet d'ignorer la case (majuscule/minuscule)
        version=regex.search(liste)
        if version:
            print version.group(1) # le groupe 1 correspond à '.*'

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 717
    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 717
    Par défaut
    Citation Envoyé par percherie Voir le message
    Peut être que ce n'est pas une véritable chaine de caractère. Pourtant que je fait afficher le résultat il me semble identique.
    Ce n'est pas une chaîne de caractères.
    C'est ici que çà le dit:
    Citation Envoyé par percherie
    En indiquant la variable retour directement dans le code précédent (ligne commentée) j'ai le retour erreur suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    version=regex.search(liste)
    TypeError: expected string or buffer
    Et "print" ne fait qu'appliquer à "liste" une méthode (str ou repr) lui permettant d'afficher quelque chose.

    Donc vous avez 2 pistes: si "liste" n'est pas une chaîne de caractères, il y a peut être plus simple (et plus fiable) que les regexp pour récupérer vos numéros de version.... à défaut (ou salement) vous pouvez toujours appliquer "str" à liste et mouliner le résultat avec la regexp.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Donc vous avez 2 pistes: si "liste" n'est pas une chaîne de caractères, il y a peut être plus simple (et plus fiable) que les regexp pour récupérer vos numéros de version.... à défaut (ou salement) vous pouvez toujours appliquer "str" à liste et mouliner le résultat avec la regexp.
    Merci Wiztricks, je n'avais pas vu ton message précédent. En mode débutant je suis parti sur la seconde solution. Conscient que ce n'est pas optimisé mais cela fonctionne avec mon niveau de connaissance de python

    Encore merci pour le temps passé.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 717
    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 717
    Par défaut
    Citation Envoyé par percherie Voir le message
    Conscient que ce n'est pas optimisé mais cela fonctionne avec mon niveau de connaissance de python
    Sûr qu'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for p in WAPT.list('hugo-7zip'):
         print p.version
    c'est hyper compliqué.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Par défaut
    J'ai trouvé comment résoudre mon problème... étant débutant, c'est bien un problème de débutant

    Il suffit de transformer la variable en chaine de caractère grâce à str()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        import re
     
        liste = WAPT.list('hugo-7zip')
     
        #WAPT.list('hugo-7zip')
        #[PackageEntry('hugo-7zip','18.1.0.0-3') architecture=x64]
        regex = re.compile(',\'(.*)\'\)',re.I) #re.I permet d'ignorer la case (majuscule/minuscule)
        version = regex.search(str(liste))
        if version:
            print version.group(1) # le groupe 1 correspond à '.*'

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 30/11/2009, 11h14
  2. Réponses: 7
    Dernier message: 05/12/2008, 09h26
  3. Comment remplacer le "where" avec une variable ?
    Par ghani25 dans le forum Forms
    Réponses: 9
    Dernier message: 28/02/2007, 09h46
  4. Faire un Lien avec une variable javascript
    Par Arvulis dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 08/08/2006, 15h20
  5. comment faire un sphère avec une texture ?
    Par fregate dans le forum OpenGL
    Réponses: 1
    Dernier message: 12/09/2005, 03h37

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