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 :

Difficulté REGEX tri + "bloc" de tri


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 6
    Par défaut Difficulté REGEX tri + "bloc" de tri
    Bonjour,

    Souhaitant trier un document texte, j'ai pour mission d'utiliser regex mais je me retrouve bloqué par des problèmes que je n'arrive pas à comprendre.
    Voici le script :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #!/usr/bin/env python
     
    import re
     
    fich = open('stockage.txt', 'r')
    listage = fich.read()
     
    MAC = []
    Puissance = []
    Pos = []
    block = re.compile('Address')
    valeurBlock = block.search(listage)
     
    while True :
        i = 0
        while (valeurBlock) is None:
            pui = re.compile('-[0-9]+')
            valeurPui = pui.search(listage)
     
            add = re.compile('([A-Z0-9]{2}:){5}[A-Z0-9]{2}')
            valeurAdd = add.search(listage)
     
            while(valeurPui):
                Puissance.append(str(valeurPui))
                valeurPui = pui.search(listage, valeurPui.end())
     
            while(valeurAdd):
    	    MAC.append(valeurAdd)
    	    valeurAdd = add.search(listage, valeurAdd.end())
     
            pos = re.compile('[0-9]+,[0-9]+')
            valeurPos = pos.search(listage)
     
            while(valeurPos):
    	    Pos.append(valeurPos)
    	    valeurPos = pos.search(listage, valeurPos.end())
     
            while(i < len(MAC)):
    	    print ("Voila comment cela doit apparaitre", MAC[0], ",", Puissance[0], ",", Pos[1], ",", Pos[0])
    	    i += 1
     
        MAC = []
        Puissance = []
        Pos = []
     
    fich.close()
    Ainsi que le fichier que je souhaite trier

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    Address            
    Signal   
    E0:A1:D7:49:74:D4  
    -69 dBm  
    72:A1:D7:49:74:D7  
    -70 dBm  
    72:A1:D7:49:74:D5  
    -69 dBm  
    28:3F:69:CC:E6:1E  
    -40 dBm  
    12:27:33:6B:BE:0C  
    -82 dBm  
    49.072633333
    4.400708333
    Address            
    Signal   
    E0:A1:D7:49:74:D4  
    -73 dBm  
    72:A1:D7:49:74:D7  
    -73 dBm  
    72:A1:D7:49:74:D5  
    -75 dBm  
    28:3F:69:CC:E6:1E  
    -35 dBm  
    12:27:33:6B:BE:0C  
    -82 dBm  
    49.072631667
    4.40071
    Address            
    Signal   
    E0:A1:D7:49:74:D4  
    -69 dBm  
    72:A1:D7:49:74:D7  
    -70 dBm  
    72:A1:D7:49:74:D5  
    -70 dBm  
    28:3F:69:CC:E6:1E  
    -38 dBm  
    12:27:33:6B:BE:0C  
    -85 dBm  
    00:1D:6A:60:C5:B2  
    -92 dBm  
    Address            
    Signal   
    E0:A1:D7:49:74:D4  
    -67 dBm  
    72:A1:D7:49:74:D7  
    -76 dBm  
    72:A1:D7:49:74:D5  
    -77 dBm  
    28:3F:69:CC:E6:1E  
    -41 dBm  
    12:27:33:6B:BE:0C  
    -85 dBm  
    00:1D:6A:60:C5:B2  
    -92 dBm  
    49.072631667
    4.400711667
    Premièrement : Les listes ne veulent pas se remplir des données que je leur donne, je l'ai remarqué lorsque je devais print les listes en fin de script

    Deuxièmement : Je ne comprends pas la manière dont je dois procéder pour décomposer les parties entre les mot 'Address'. Mon objectif est de faire correspondre chaque adresse MAC ainsi que leur puissance à leurs coordonnée géographique latitude et longitude (le 49,xxx et 4.xxx)

    Merci

  2. #2
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    Pourquoi cette boucle infinie ? Surtout que dans ton code, il n'y a rien qui permette d'en sortir.
    Cela n'a aucun intérêt de faire des re.compile dans ta boucle, cela alourdit même la chose.

    Pour ton besoin, il faut procéder logiquement, la 1ère chose à faire est de récupérer chaque « blocs » contenant les positions, et ensuite de ces blocs en tirer les adresses et puissances macs.
    Et ainsi construire au fil du parcours un dictionnaire avec pour clé la position (tuple) et valeurs une liste de tuples des adresses et puissances.

    En partant des valeurs de ton fichier, cela pourrait donner :

    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
    import re
     
    with open('stockage.txt', 'r') as f :
        donnees = f.read()
     
    dico = {}
     
    mblocs = 'Address *\nSignal *\n(.*?)(\d+\.\d+) *\n(\d+\.\d+)'
    mmacs = '((?:[A-Z0-9]{2}:){5}[A-Z0-9]{2}) *\n(-\d+)'
     
    for bloc in re.finditer(mblocs, donnees, flags=re.S) :
        pos = (bloc.group(2), bloc.group(3))
        dico.setdefault(pos, []) # Par précaution
        for mac in re.finditer(mmacs, bloc.group(1)) :
            dico[pos].append((mac.group(1), mac.group(2)))
     
    from pprint import pprint
    pprint(dico)

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 6
    Par défaut
    Merci pour ta réponse

    J'ai lu est je pense avoir compris le script cependant je me perds un peu avec l'énorme liste , quelles "variable" devrais-je prendre afin de stocker dans ma base de donnée dans l'ordre : mac ; puissance ; longitude ; latitude

  4. #4
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Le dict est alors inutile si tu as besoin d'insérer ces données dans une table (ce n'est sans doute pas l'idéal de stocker tout ça dans une même table, mais c'est un autre débat).

    Pour récupérer ces valeurs, il suffit de modifier légèrement ce bout de script.

    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
    import re
     
    with open('stockage.txt', 'r') as f :
        donnees = f.read()
     
    mblocs = 'Address *\nSignal *\n(.*?)(\d+\.\d+) *\n(\d+\.\d+)'
    mmacs = '((?:[A-Z0-9]{2}:){5}[A-Z0-9]{2}) *\n(-\d+)'
     
    for bloc in re.finditer(mblocs, donnees, flags=re.S) :
        latitude = float(bloc.group(2))
        longitude = float(bloc.group(3))
        for mac in re.finditer(mmacs, bloc.group(1)) :
            adresse = mac.group(1)
            puissance = int(mac.group(2))
            print('adr :', adresse, '; puis. :', puissance, '; long. :', longitude, '; lat. :', latitude)

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2018
    Messages : 6
    Par défaut Merci
    Merci beaucoup pour l'aide

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

Discussions similaires

  1. Comment implementer Try catch bloc en java?
    Par stpaul04 dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 21/05/2014, 16h03
  2. Regex: supprimer les simples quotes
    Par RTK45 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 23/02/2012, 10h03
  3. Tri sur blocs de données avec AWK
    Par adelphine dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 17/01/2011, 14h48

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