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 :

Expression régulière Python & telnetlib


Sujet :

Python

  1. #1
    Membre éprouvé
    Avatar de Gecko
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Décembre 2008
    Messages
    499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Décembre 2008
    Messages : 499
    Points : 1 277
    Points
    1 277
    Par défaut Expression régulière Python & telnetlib
    Bonjour,

    j'ai actuellement un soucis sous Python 3. Je tente de match une chaine et de récupérer par la même occasion les valeurs de id et msg.

    Response est le résultat d'une requête en telnet, avec telnetlib, et quoi que je fasse je ne parviens pas au résultat voulu

    Code python : 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
     
    # récupération du retour et conversion en string
    response = str(self.__telnet.read_until(b"\n\r", self.__timeout))
     
    # response contiens "b'error id=12345 msg=error message'"
    # La conversion byte to string semble poser problème aussi, peut être que ce n'est pas la bonne méthode
    error = re.match("error id=([\d]+) msg=([\w ]+)", response)
     
    if error is None:
      # traitement des données
     
      # On écrase response pour obtenir le message d'erreur
      error = re.match("error id=([\d]+) msg=([\w ]+)", response)
     
    # Traitement du message d'erreur (systématique même en cas de succès)
     
    # suite...

    Actuellement je tombe toujours dans ma condition, error vaut toujours None et je comprend pas pourquoi

    Merci d'avance pour votre aide
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($toBe || !$toBe) echo 'That is the question';

    Mes projets: DVP I/O

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Dans la doc officielle Python : https://docs.python.org/3/library/stdtypes.html#bytes

    Ils disent ceci :

    Note: For Python 2.x users: In the Python 2.x series, a variety of implicit conversions between 8-bit strings (the closest thing 2.x offers to a built-in binary data type) and Unicode strings were permitted. This was a backwards compatibility workaround to account for the fact that Python originally only supported 8-bit text, and Unicode text was a later addition. In Python 3.x, those implicit conversions are gone - conversions between 8-bit binary data and Unicode text must be explicit, and bytes and string objects will always compare unequal.
    De plus, je pense que vous pouvez simplifier votre regexp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    r"error id=([\d]+) msg=([\w ]+)" => r"error id=(\d*) msg=(.*)"
    Note : pour les motifs regexp, préférez utiliser les rawstrings r"" plutôt que les strings "", les séquences d'échappement \ sont mieux prises en charge.

    Pensez aussi à re.compile(pattern) pour les motifs qui se répètent dans le code : c'est bien pratique.

    @+.
    Dernière modification par Invité ; 12/06/2014 à 22h44.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    telnetlib a certainement une importance pour raconter le contexte, mais le reste se passe à la console:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >>> response = b'error id=12345 msg=error message'
    >>> import re
    >>> error = re.match("error id=([\d]+) msg=([\w ]+)", response)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "c:\py_env\py32-32\lib\re.py", line 156, in match
        return _compile(pattern, flags).match(string)
    TypeError: can't use a string pattern on a bytes-like object
    >>> error = re.match(b"error id=([\d]+) msg=([\w ]+)", response)
    >>> error
    <_sre.SRE_Match object at 0x026BF8D8>
    >>> error.groups()
    (b'12345', b'error message')
    >>>
    a priori, çà plante bien plus méchant qu'un simple "error = None" sinon çà fonctionne...
    Quel était le problème?

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

  4. #4
    Membre éprouvé
    Avatar de Gecko
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Décembre 2008
    Messages
    499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Décembre 2008
    Messages : 499
    Points : 1 277
    Points
    1 277
    Par défaut
    Merci pour vos réponses, entre temps j'ai réécrit la partie qui encode/décode mes requêtes.

    J'ai implémenté deux fonctions dans ma classe pour le faire plus facilement et être sûr que tout reste cohérent:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      def __toString(self, data = None):
        if data is not None:
          return str(data, encoding='UTF-8')
     
      def __toBytes(self, data = None):
        if data is not None
          return bytes(data, encoding='ascii')

    Depuis je n'ai plus de problèmes liés à l'encodage et je récupère bien des valeurs propres ce qui facilite le traitement.

    J'ai revu par la même occasion le code source des requêtes qui sont désormais traitées de la sorte :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    endCommandLine = self.__toBytes("\n\r")
    response = self.__toString(self.__telnet.read_until(endCommandLine, self.__timeout))
    error = re.match("error id=([\d]+) msg=([\w ]+)", response)
    if error is not None:
      print(error.groups())

    Le code semble fonctionner au poil, le gros problème était le manque de cohérence dans la conversion str <=> bytes.

    Merci pour votre aide
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($toBe || !$toBe) echo 'That is the question';

    Mes projets: DVP I/O

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

Discussions similaires

  1. Compréhension d'un script PYTHON et expressions régulières
    Par Jéjé34 dans le forum Général Python
    Réponses: 2
    Dernier message: 04/06/2013, 07h58
  2. Problème expression régulière python
    Par cup of tea dans le forum Général Python
    Réponses: 2
    Dernier message: 28/03/2012, 00h48
  3. Expressions réguliéres
    Par Tooms dans le forum Langage
    Réponses: 4
    Dernier message: 06/12/2002, 18h42
  4. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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