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é pour extraire une partie d'un contenu textuel


Sujet :

Python

  1. #1
    Débutant
    Inscrit en
    Juin 2007
    Messages
    453
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 453
    Points : 97
    Points
    97
    Par défaut Difficulté pour extraire une partie d'un contenu textuel
    Bonjour,

    Mon objectif est d'extraire une partie d'une chaine de caractère. Le texte est de cette forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    du texte avec toute les possibilités.
     
    key_1: value_1 value2...
              value3
    key_2: value 2 value 22....
    du texte qui peut rassembler a tout...
    Mon but est d'extraire le key 1 avec tous ses valeurs (qui peuvent être sur la même ligne ou sur plusieurs lignes. Lé délimiteur n'est qu'une autre ligne avec également un nouveau key_value ou saut de ligne.

    J'ai essayé avec pyparsin en utilisant le code suivant mais en vain:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    from pyparsing import *
    key_name = Word(alphanums+'_')
    key_ending =  ZeroOrMore(' ') +':'
    key = key_name + key_ending
    value = Word(alphanums) + NotAny(key_ending)
    values = OneOrMore(value)
    param = Group(key + values)
    param_stream = OneOrMore(param)
    for param in r.asList():
        param[0], param[2:]
    et voilà un exemple de text d'entrée :

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    From: Blabla bhlkf <Blabla.bhlkf@atghg.tele2.com>
    Sent: 2014-01-22 14:21:31
    To: "support@atghg.com" <support@atghg.com>
    Subject: Blablablabla bla bla Subject
    Case request:                           STL Cas Hours (JKLM, KJH 1 24x7 EPLi
    Loc)
    Request Type:                           Support (HTL)
    Product:                                TGHLKI HS+ / BLOS V. 9.9.x.x
    Product Instance State:                 In Service
    DSLAM address:                  HGJLKM
    Problem Description:                    All usershoud be in nkowns
                                   that the first line should be also extracted
    Ticket Priority:                                3 = Very import request
    Contact Name:                           Blabla
    Contact phone:                          +0187 87652 99883 
    Alternate phone:                        +012 7890 877343 1 9009 35
    Tele2UTA Ticket ID:                     HGFDL5666
    Service Agreement:                      7543864
    Contact Company:                        FAX2
    xlfswott01> users -l | grep 001.14.06
    616804042  001.14.060/0001 001:14:060/ 2044K/ 252K ATM 0.0.0.0      
    1:14:60-0.100-T-066048   0:07:31    0:00:00
    616804043  001.14.060/0001 001:14:060/ 2044K/ 252K ATM 0.0.0.0      
    1:14:60-8.35-T-066048    0:07:32    0:00:00
    616804044  001.14.060/0001 001:14:060/ 2044K/ 252K ATM 0.0.0.0      
    1:14:60-8.40-T-066048    0:07:32    0:00:00
    616804054  001.14.064/0001 001:14:064/ 2044K/ 252K ATM 0.0.0.0      
    1:14:64-0.100-T-066050   0:07:20    0:00:00
    616804055  001.14.064/0001 001:14:064/ 2044K/ 252K ATM 0.0.0.0      
    1:14:64-8.35-T-066050    0:07:20    0:00:00
    616804056  001.14.064/0001 001:14:064/ 2044K/ 252K ATM 0.0.0.0      
    1:14:64-8.40-T-066050    0:07:21    0:00:00
    616804057  001.14.065/0001 001:14:065/ 2044K/ 252K ATM 0.0.0.0      
    1:14:65-0.100-T-067398   0:07:22    0:00:00
    616804058  001.14.065/0001 001:14:065/ 2044K/ 252K ATM 0.0.0.0      
    1:14:65-8.35-T-067398    0:07:25    0:00:00
    616804059  001.14.065/0001 001:14:065/ 2044K/ 252K ATM 0.0.0.0      
    1:14:65-8.40-T-067398    0:07:26    0:00:00
    <end user list>  3053 active user(s)
    <grep> Found 9 line(s) matching search criteria
    xlfswott01> users -l | grep 001.14.05
    616804031  001.14.054/0001 001:14:054/ 6997K/ 903K ATM 0.0.0.0      
    1:14:54-0.100-T-004048   0:08:14    0:00:00
    616804032  001.14.054/0001 001:14:054/ 6997K/ 903K ATM 0.0.0.0      
    1:14:54-8.35-T-004048    0:08:15    0:00:00
    616804033  001.14.054/0001 001:14:054/ 6997K/ 903K ATM 0.0.0.0      
    1:14:54-8.40-T-004048    0:08:16    0:00:00616804034  001.14.055/0001
    001:14:055/ 7997K/ 903K ATM 0.0.0.0         1:14:55-0.100-T-065997   0:08:17   
    0:00:00
    616804035  001.14.055/0001 001:14:055/ 7997K/ 903K ATM 0.0.0.0       
    1:14:55-8.35-T-065997    0:08:17    0:00:00
    616804036  001.14.055/0001 001:14:055/ 7997K/ 903K ATM 0.0.0.0      
    1:14:55-8.40-T-065997    0:08:20    0:00:00
    616804037  001.14.057/0001 001:14:057/ 2044K/ 252K ATM 0.0.0.0      
    1:14:57-0.100-T-071069   0:08:20    0:00:00
    616804038  001.14.057/0001 001:14:057/ 2044K/ 252K ATM 0.0.0.0      
    1:14:57-8.35-T-071069    0:08:22    0:00:00
    616804039  001.14.057/0001 001:14:057/ 2044K/ 252K ATM 0.0.0.0      
    1:14:57-8.40-T-071069    0:08:23    0:00:00
    616804040  001.14.059/0001 001:14:059/ 2044K/ 252K ATM 0.0.0.0      
    1:14:59-0.100-T-155435   0:08:23    0:00:00
    616804041  001.14.059/0001 001:14:059/ 2044K/ 252K ATM 0.0.0.0      
    1:14:59-8.40-T-155435    0:08:24    0:00:00
    616804048  001.14.050/0001 001:14:050/ 2044K/ 252K ATM 0.0.0.0      
    1:14:50-0.100-T-064163   0:08:09    0:00:00
    616804049  001.14.050/0001 001:14:050/ 2044K/ 252K ATM 0.0.0.0      
    1:14:50-8.35-T-064163    0:08:08    0:00:00
    616804050  001.14.050/0001 001:14:050/ 2044K/ 252K ATM 0.0.0.0      
    1:14:50-8.40-T-064163    0:08:10    0:00:00
    616804051  001.14.051/0001 001:14:051/   13M/1047K ATM 0.0.0.0      
    1:14:51-0.100-T-080123   0:08:10    0:00:00
    616804052  001.14.051/0001 001:14:051/   13M/1047K ATM 0.0.0.0      
    1:14:51-8.35-T-080123    0:08:10    0:00:00
    616804053  001.14.051/0001 001:14:051/   13M/1047K ATM 0.0.0.0      
    1:14:51-8.40-T-080123    0:08:13    0:00:00
    <end user list>  3050 active user(s)
    mit HFDSKJKJR LIKLSS
    BLAB HGFDO
    COMPANY Telecom
    DESEARCH DEVELOPEMENT Network Operation Center (NOC)
    Donau-City-Strasse 11, 1220 Wien
    service@atgljkfyh.com
    ******** WICHTIGER HINWEIS ********
    balblablablbalbalnbabTele2bmlablablalablaba.
    blablablablaba.
    ******** IMPORTANT NOTICE ********
    blablablbalbablabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.
    lablablbalablblb.
    ou je dois extraire l'élément "Problem Description: " avec son valeur qui s'étale ici sur deux lignes.

    Je vous remercie d'avance pour vos réactions.

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    basiquement le principe peut se résumer à identifier la ligne commençant par "Problem description:", prendre ce qui traîne après les deux points jusqu'à la fin de la ligne, puis lire une nouvelle ligne et extraire à nouveau le texte, ça se fait très bien programmatiquement avec des notions de base en Python (des if, des while, des startswith() etc.)

    une façon un peu plus efficace pourra faire appel aux expressions rationnelles (les "regex"), un exemple parmi d'autres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> with open('fichier', 'r') as f:
    ...   data = f.read()
    >>> ' '.join(re.findall('Problem Description:\s+(.+)\n\s+(.+)', data)[0])
    'All usershoud be in nkowns that the first line should be also extracted'
    on lit l'intégralité du fichier dans la variable data, avec re.findall() on extrait uniquement ce qui nous intéresse en se payant le luxe de virer les espaces superflus au passage, à la fin on join() les deux morceaux récupérés, note que ça ne fonctionne en l'état que si la description tient sur exactement 2 lignes, ni plus, ni moins, dans le cas contraire il faut au minimum adapter la regex, laissé en exercice.

  3. #3
    Débutant
    Inscrit en
    Juin 2007
    Messages
    453
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 453
    Points : 97
    Points
    97
    Par défaut
    Je vous remercie pour votre réponse. Je l'ai testé sur l'exemple déjà mis dans le premier post et ça me renvoi rien. En plus, avez-vous une idée comment modifier ce que j'ai écrit en utilisant l'api pyparsing pour régler le souci et extraire que le données dont j'ai besoin. Je vous remercie d'avance pour votre retour.

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par fraisa1985 Voir le message
    Je l'ai testé sur l'exemple déjà mis dans le premier post et ça me renvoi rien.
    moi aussi je l'ai testé avec le fichier que tu donnes dans ton premier post, et ça renvoi bien

    En plus, avez-vous une idée comment modifier ce que j'ai écrit en utilisant l'api pyparsing
    ça doit être faisable, mais honnêtement je ne prendrais pas cette peine, d'une part parce que le propos n'est pas de te donner la solution toute faite, d'autre part parce qu'utiliser pyparsing pour parser un fichier de configuration ou un rapport de log ça n'est pas du tout adapté, au mieux c'est comme dézinguer une mouche avec un bazooka, aucun intérêt.

    dans le cas présent je te conseille de t'intéresser fortement aux expressions rationnelles, élément absolument indispensable de la programmation moderne et ce qu'il y a de plus adapté ici, et/ou de continuer ton apprentissage du langage Python, comment itérer sur les lignes d'un fichier, comment faire un if etc.

  5. #5
    Débutant
    Inscrit en
    Juin 2007
    Messages
    453
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 453
    Points : 97
    Points
    97
    Par défaut
    Vous l'avez testé avec python 2.7 ou 3.X ?

    Je n'arrive pas à comprendre pourquoi ça marche moi pour moi ?

  6. #6
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par fraisa1985 Voir le message
    Vous l'avez testé avec python 2.7 ou 3.X ?
    les deux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ python2 -c "import re; print(' '.join(re.findall('Problem Description:\s+(.+)\n\s+(.+)', open('fichier', 'r').read())[0]))"
    All usershoud be in nkowns that the first line should be also extracted
    $ python3 -c "import re; print(' '.join(re.findall('Problem Description:\s+(.+)\n\s+(.+)', open('fichier', 'r').read())[0]))"
    All usershoud be in nkowns that the first line should be also extracted
    Je n'arrive pas à comprendre pourquoi ça marche moi pour moi ?
    ça peut venir de pleins de choses, je pense aux fins de lignes par exemple en \r\n au lieu de \n

Discussions similaires

  1. Réponses: 5
    Dernier message: 04/07/2007, 18h31
  2. extraire une partie d'un document rtf
    Par yac dans le forum Oracle
    Réponses: 12
    Dernier message: 08/01/2006, 10h44
  3. [JNI] Difficultés pour utiliser une DLL
    Par etiennegaloup dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 15/08/2005, 21h29
  4. En difficulté pour faire une requete
    Par Fonzy17 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 21/03/2005, 10h56
  5. requete pour reccuperer une parti d'un resultat
    Par ViBy dans le forum Langage SQL
    Réponses: 6
    Dernier message: 03/09/2004, 09h33

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