Expression régulière [python]

ilyess_kira Messages postés 49 Statut Membre -  
ilyess_kira Messages postés 49 Statut Membre -
Bonjour,

J'ai un problème dans le quel je me noie depuis un moment et j'aimerais avoir de l'aide svp

Je m'explique. J'ai une page qui est divisé en 2 à l'aide des frames ... ( je sais que c'est obsolète mais on m'a demandé de faire avec )

dans la première frame je dois afficher 4 messages que j'ai du extraire d'un fichier log à l'aide des expression régulière. ça c'est OK.

voilà mes 4 messages
dls_rlc_mac_ue_configuration_request_t
dls_rlc_mac_ue_configuration_response_t
dls_rlc_mac_bearer_configuration_request_t
dls_rlc_mac_bearer_configuration_response_t

c'est 4 message je les ai transformées sous forme de lien en html pour qu'il me charge chacun une page différente dans la frame 2

de l'autre coté j'ai un fichier qui s'appele itf.h qui ressemble à ça :

typedef struct {
......
......
typedef struct {
  eNodeBHeader_t          eNodeBHeader;
  // Index of the cell within CEM
  u8                      cEMCellIndex;
  // reserved for bits alignement
  u8                      reserved5;
  u16                     reserved6;
  // Flag for PCMD measurements
  // 0:FALSE PCMD not activated , 1:TRUE PCMD activated
  ................
} PACKED_GNU dls_rlc_mac_bearer_configuration_request_t;


typedef struct {
  eNodeBHeader_t          eNodeBHeader;
  // Index of the cell within CEM
  u8                      cEMCellIndex;
  // reserved for bits alignement
  u8                      reserved5;
  u16                     reserved6;
  // list of bearers ok or nok after configuration
  RbListSuccessFailure_t  rbListSuccessFailure; 
...........

} PACKED_GNU dls_rlc_mac_bearer_configuration_response_t;


typedef struct {
  eNodeBHeader_t          eNodeBHeader;
  // Index of the cell within CEM
  u8                      cEMCellIndex;
  // reserved for bits alignement
  u8                      reserved5;
................

} PACKED_GNU dls_rlc_mac_bearer_configuration_response_t;




Ce que je veux faire maintenant c'est de faire un programme en python qui me repère tout d'abord mes 4 messages dls-rlc dans ce fichier une fois repérer il doit me renvoyer toute la structure de ce message dans ma frame 2

un exemple:

mon programme doit analyser toutes les lignes de mon fichier

typedef struct { //une fois fois qu'il va tomber sur typedef struct
eNodeBHeader_t eNodeBHeader; //il doit mettre toutes les lignes qui suivent
// Index of the cell within CEM // dans un tableau à condition que
u8 cEMCellIndex; //que le message recherché soit
// reserved for bits alignement //similaire à celui qui se trouve
u8 reserved5; //....
................

} PACKED_GNU dls_rlc_mac_bearer_configuration_response_t; // à la fin de la typedef struct

Je ne sais pas si ma méthode est bonne ... Toute suggestion sera la bienvenue

Merci si vous avez pris le temps d'aller jusqu'au bout de mon message

3 réponses

  1. heyquem Messages postés 808 Statut Membre 131
     
    Dans le fichier itf.h que tu donnes , il y a deux sections

    typedef struct {
    eNodeBHeader_t eNodeBHeader;
    .......................
    ........
    ................
    ...........

    } PACKED_GNU dls_rlc_mac_bearer_configuration_response_t;


    se terminant par la même chaîne dls_rlc_mac_bearer_configuration_response_t
    mais avec des contenus différents.

    Est-ce normal ou une erreur ?

    D'autre part, je comprends que dls_rlc_mac_bearer_configuration_response_t est ce qui caractérise une section, son nom en quelque sorte, mais où se trouve le message dans le contenu d'une section dont tu dis qu'il doit être similaire au nom de la section ??
    0
  2. heyquem Messages postés 808 Statut Membre 131
     
    Voici la regex pour attraper les contenu de tes sections

    regx = re.compile('typedef struct {'
    '(.+?)'
    '} PACKED_GNU dls_rlc_mac_(?:ue|bearer)_configuration_re(?:quest|sponse)_t;',
    re.DOTALL)

    En Python, quand deux chaînes se trouvent côte à côte, comme par exemple:
    'raton'    '-'     'laveur' 

    elles sont concaténées automatiquement, d'où
    print 'raton'      '-'       'laveur' 
    affiche
    raton-laveur

    Par ailleurs, entre parenthèses, les retours à la ligne ne comptent pas, donc écrire
    ('raton'  
    '-'  
    'laveur') 
    c'est comme si on écrivait
    ('raton'     '-'      'laveur')
    0
    1. ilyess_kira Messages postés 49 Statut Membre
       
      j'ai essayé avec ta regex .. et ça ne m'affiche pas ce que je veux
      0
    2. heyquem Messages postés 808 Statut Membre 131
       
      ben dis plutôt ce que ça t'affiche
      et ce que tu veux !!
      0
    3. heyquem Messages postés 808 Statut Membre 131
       
      d'autre part si tu pouvais répondre à ma question qui se trouve dans ma première réponse............
      0
    4. ilyess_kira Messages postés 49 Statut Membre
       
      Dans mon fichier il y'a plein de message et j'ai l'impression que cette regex prend un typedef struct au hasard ( sachant qu'elle prenne pas le premier) et elle me renvoie tous le reste du fichier ...
      et désolé si je n'ai pas vu ta question mais effectivement c'était une erreur de ma part . il n'y'a pas 2 fois le même message caractérisant 2 sections différentes.
      et à propos de son positionnement il se trouve comme je l'ai indiqué à la fin de chaque section



      typedef struct { // début de section  
        eNodeBHeader_t          eNodeBHeader; 
        // Index of the cell within CEM 
        u8                      cEMCellIndex; 
        // reserved for bits alignement 
        u8                      reserved5; 
      ................ 
      
      } PACKED_GNU dls_rlc_mac_bearer_configuration_response_t;
      // fin de section

      et merci
      0
    5. heyquem Messages postés 808 Statut Membre 131
       
      Est-ce que tu peux poster le contenu de ton fichier itf.h et ce que capte ma regex sur un site de partage de fichiers, stp ?
      0
  3. heyquem Messages postés 808 Statut Membre 131
     
    Je suis idiot.

    J'ai fait tourner le code suivant:

    import re  
    
    with open('itf.h','rb') as f:  
        ch = f.read()  
    
    
    regx = re.compile('typedef struct {'  
                      '(.+?)'  
                      '} PACKED_GNU dls_rlc_mac_(?:ue|bearer)_configuration_re(?:quest|sponse)_t;',  
                      re.DOTALL)   
    
    
    print 'len(ch) ==',len(ch)  
    mat = regx.search(ch)  
    print 'mat',mat  
    print '\nlen(mat.group())',len(mat.group())  
    print 'mat.start()',mat.start()  
    print 'mat.end()',mat.end()  
    print '\nlen(mat.group(1))',len(mat.group(1))  
    print 'mat.start(1)',mat.start(1)  
    print 'mat.end(1)',mat.end(1)  
    
    x = mat.start()  
    extrait_debut = ch[x:x+500]  
    print '\n\n=============================================='  
    print extrait_debut  
    
    
    
    y = mat.end()  
    extrait_fin = ch[y-4670:y]  
    print '\n\n-----------------------------------------------'  
    print extrait_fin


    Le résultat est:

    len(ch) == 221616  
    mat <_sre.SRE_Match object at 0x011BF960>  
    
    len(mat.group()) 119971  
    mat.start() 16294  
    mat.end() 136265  
    
    len(mat.group(1)) 119904  
    mat.start(1) 16310  
    mat.end(1) 136214  
    
    
    ==============================================  
    typedef struct {  
      u16                         cumCounterId;  
      u16                         nbrOfScreening;  
    
    } PACKED_GNU cum_counter_t;  
    
    
    typedef struct {  
      u16                         valCounterId;  
      u16                         nbrOfScreening;  
    
    } PACKED_GNU val_counter_t;  
    
    /** values for LOAD counters. */  
    /*! \struct load_counter_t  
     *  \brief used in the dls_loc_typ_occurrence_t.  
     */  
    typedef struct {  
      u16                         loadCounterId;  
      u16                         nbrOfScreening;  
    
    } P  
    
    
    -----------------------------------------------  
    ______  
    
    //////////////////////////////////////////////////////////////  
    //      DLS_RLC_MAC_UE_CONFIGURATION_REQUEST        
    //////////////////////////////////////////////////////////////  
    typedef struct {  
      eNodeBHeader_t          eNodeBHeader;  
      // Ue Identifier on radio interface  
      u16                     cRNTI;  
      // Index of the cell within CEM  
      u8                      cEMCellIndex;  
      // Indicates if this UE is in handover  
      u8                      handoverIndicator;  
      // Presence flag for optional IE oldUeContextId,   
      // 1 = IE present, 0 = IE NOT present  
      u8                      oldUeContextIdPresent;  
      // Needed for RRC Connection Re-establishment procedure  
      u8                      reserved1;  
      u16                     oldUeContextId;  
    
      MACDLUeInfo_t           mACDLUeInfo;  
      UeCtxtInactivityInfo_t  ueCtxtInactivityInfo;  
      // Flag for PCMD measurements  
      // 0:FALSE PCMD not activated , 1:TRUE PCMD activated  
      u8                      pCMDActivate;  
      // Presence flag for optional IE UeCapabilities  
      // 1 = IE is valid, 0 = IE NOT valid  
      u8                      ueCapabilitiesPresent;  
      // reserved for bits alignement  
      u16                     reserved2;  
      UeCapabilitiesInfo_t    ueCapabilitiesInfo;  
    
      // Ue SPS info  
      u32                     SpsConfigInfoPresent;  
      SpsUeInfo_t             SpsUeInfo;  
    
      // DL Aggregate Maximum Bit Rate  
      u32                     dlAmbrPresence;  
      u32                     dlAmbr;  
      // CSFB Info  
      u8                      csFbDrxInfoValidity;  
     // reserved for bits alignement  
      u8                      reserved3;  
      u16                     reserved4;  
      csFbDrxInfo_t           csFbDrxInfo;    
      // drx Info for Intra Lte automatic neighbour relation   
      u8                      intraLteAnrDrxInfoValidity;  
      // reserved for bits alignement  
      u8                      reserved5;  
      u16                     reserved6;  
      intraLteAnrDrxInfo_t    intraLteAnrDrxInfo;  
      // drx Info for Inter RAT automatic neighbour relation   
      u8                      interRatAnrDrxInfoValidity;  
      // reserved for bits alignement  
      u8                      reserved7;  
      u16                     reserved8;  
      interRatAnrDrxInfo_t    interRatAnrDrxInfo;  
      // RB list  
      RbListToBeSetup_t       rbListToBeSetup;  
    
    
    #define DLS_RLC_MAC_CQI_MODE_APERIODIC    0  
    #define DLS_RLC_MAC_CQI_MODE_PERIODIC     1  
    #define DLS_RLC_MAC_CQI_MODE_BOTH         2  
      u8    cqi_mode;                 /*!< CQI mode: aperiodic only, periodic only or both */  
    
    #define DLS_RLC_MAC_CQI_WIDEBAND          0  
    #define DLS_RLC_MAC_CQI_NARROWBAND_MAX    4  
    #define DLS_RLC_MAC_CQI_NARROWBAND(k)     (k)  
      u8    wide_narrow_band_and_k;   /*!< Wideband/narrowband and K */  
    
    #define DLS_RLC_MAC_CQI_PUCCH_RES_IDX_MIN   0  
    #define DLS_RLC_MAC_CQI_PUCCH_RES_IDX_MAX   1185  
      u16   cqi_pucch_res_idx;        /*!< CQI PUCCH Resource Index */  
    
    #define DLS_RLC_MAC_CQI_PMI_CONFIG_IDX_MIN    0  
    #define DLS_RLC_MAC_CQI_PMI_CONFIG_IDX_MAX    1023  
      u16   cqi_pmi_config_idx;       /*!< CQI PMI Config Index */  
    
    #define DLS_RLC_MAC_RI_CONFIG_IDX_MIN         0  
    #define DLS_RLC_MAC_RI_CONFIG_IDX_MAX         1023  
      u16   ri_config_idx;            /*!< CQI RI Config Index */  
    
     u8    reserved9;  
       
    #define DLS_RLC_MAC_CQI_REPORT_MODE_APER_RM30     1 /* mode 3-0 : supported */  
    #define DLS_RLC_MAC_CQI_REPORT_MODE_APER_RM31   2 /* mode 3-1 : supported */  
    #define DLS_RLC_MAC_CQI_REPORT_MODE_APER_RM12     3 /* mode 1-2 : supported */  
    #define DLS_RLC_MAC_CQI_REPORT_MODE_APER_RM20     4 /* mode 2-0 : not supported */  
    #define DLS_RLC_MAC_CQI_REPORT_MODE_APER_RM22     5 /* mode 2-2 : not supported */  
    #define DLS_RLC_MAC_CQI_REPORT_MODE_APER_SPARE3   6 /* spare 3  : not supported */  
    #define DLS_RLC_MAC_CQI_REPORT_MODE_APER_SPARE2   7 /* spare 2  : not supported */  
    #define DLS_RLC_MAC_CQI_REPORT_MODE_APER_SPARE1   8 /* spare 1  : not supported */  
    #define DLS_RLC_MAC_CQI_REPORT_MODE_APER_MAX      DLS_L1_CQI_REPORT_MODE_APER_SPARE1  
      u8                      cqi_reporting_mode_aperiodic; /*!< CQI reporting mode aperiodic */  
    
      // FDD and TDD on bCEM   
      // Offset to avoid starting DRX cycle at the same moment  
      u16                     drxStartOffsetForCsFb;  
      u16                     drxStartOffsetForIntraLteAnr;  
      u16                     drxStartOffsetForInterRATAnr;  
       
      // reserved for spare items  
      s32                     spare0;  
      s32                     spare1;  
      s32                     spare2;  
      s32                     spare3;  
      s32                     spare4;  
      s32                     spare5;  
      s32                     spare6;  
      s32                     spare7;  
      s32                     spare8;  
      s32                     spare9;  
    } PACKED_GNU dls_rlc_mac_ue_configuration_request_t


    Ce qui signifie que ton texte fait 221616 caractères et que ma regex matche sur 119971 caractères entre les positions 16294 et 136265

    Mais ce qui nous intéresse , c'est le groupe 1 , défini par (.+?):
    il matche sur 119904 caractères entre les positions 16310 et 136214

    Le début de la portion matchante commence par
    'typedef struct {' mais la section en question ne finit pas par
    '} PACKED_GNU dls_rlc_mac_........' , c'est là le problème

    Pour afficher le dernier 'typedef struct {'
    avant le premier
    '} PACKED_GNU dls_rlc_mac_ue_configuration_request_t' rencontré,
    il a fallu que je remonte 4670 caractères en amont de la fin du groupe 1 capturé.

    C'est un problème de regex mal conçue.

    Je donne la correction dansle prochain post
    0
    1. ilyess_kira Messages postés 49 Statut Membre
       
      Oulala c'est au dela de cpacités de compréhension tous ça .... j'ai un peu du mal à suivre tous ça
      je voulais te demander ausssi s'il n'y a pas moyen de spliter tous un texte ? ce serait plus façile non ?
      0
    2. heyquem Messages postés 808 Statut Membre 131
       
      y a un problème dans ton texte, apparemment

      je suis en train de chercher


      tu peux spliter les ligne avec splitlines(), oui
      mais ça ne sera pas plus simple à mon avis
      0
    3. heyquem Messages postés 808 Statut Membre 131
       
      c'est bon ,j'ai trouvé
      encore une idiotie de ma part
      j'avais mis [^ ]+ au lieu de [^\n]+ dans un pattern de regex
      0
    4. ilyess_kira Messages postés 49 Statut Membre
       
      ah cool du coup est-ce que tu peux me passe le bon code qui fonctionne stp?
      0
    5. heyquem Messages postés 808 Statut Membre 131
       
      Bien sûr. Mais entre le moment où on trouve l'erreur et celui où on finit le code, y a un petit délai (avec Java ou C++, ce délai serait au moins 5 fois plus long)

      Voilà le code.

      Ce que tu veux se trouve dans l'objet voulus
      sous forme de couples: le premier élément est le nom de la section de laquelle a été extraite la chaîne qui est le deuxième élément

      Et y avait pas de problème dans ton texte, c'est moi qui avait écrit une idiotie


      import re 
      
      with open('itf.h','rb') as f: 
          ch = f.read() 
      
      regx = re.compile('typedef struct {' 
                        '(.+?)' 
                        '} *' 
                        '([^\n]+)', 
                        re.DOTALL) 
      
      regx_config = re.compile('dls_rlc_mac_(?:ue|bearer)_configuration_re(?:quest|sponse)_t') 
      
      print 'len(ch) ==',len(ch) 
      
      voulus,pour_afficher,refus = [],[],[] 
      
      for mat in regx.finditer(ch): 
          gr2 = mat.group(2) 
          if regx_config.search(gr2): 
              voulus.append(mat.group(2,1)) 
              pour_afficher.append('\nlen de la section==%d      span de la section==%r\n\n' 
                                   '%s' % (len(mat.group()), mat.span(),mat.group()) 
                                   ) 
          else: 
              refus.append('%-60r    span()==%r  PAS RECHERCHÉ' % (gr2,mat.span())) 
      
      
      
      print '\n'.join(refus) 
      print '\n\n' 
      print '\n\n==============================================================='.join(pour_afficher) 
               
      
      print '\n\n---------------------------------\nlen(fichier) == %d' % len(ch)
      0