Expression régulière [python]

Fermé
ilyess_kira Messages postés 45 Date d'inscription mercredi 9 mai 2012 Statut Membre Dernière intervention 6 décembre 2012 - 6 juin 2012 à 10:35
ilyess_kira Messages postés 45 Date d'inscription mercredi 9 mai 2012 Statut Membre Dernière intervention 6 décembre 2012 - 7 juin 2012 à 14:15
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

A voir également:

3 réponses

heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
Modifié par heyquem le 6/06/2012 à 12:11
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
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
Modifié par heyquem le 6/06/2012 à 12:26
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
ilyess_kira Messages postés 45 Date d'inscription mercredi 9 mai 2012 Statut Membre Dernière intervention 6 décembre 2012
6 juin 2012 à 14:00
j'ai essayé avec ta regex .. et ça ne m'affiche pas ce que je veux
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
6 juin 2012 à 14:03
ben dis plutôt ce que ça t'affiche
et ce que tu veux !!
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
6 juin 2012 à 14:04
d'autre part si tu pouvais répondre à ma question qui se trouve dans ma première réponse............
0
ilyess_kira Messages postés 45 Date d'inscription mercredi 9 mai 2012 Statut Membre Dernière intervention 6 décembre 2012
Modifié par ilyess_kira le 6/06/2012 à 14:13
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
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
6 juin 2012 à 14:27
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
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
Modifié par heyquem le 6/06/2012 à 15:37
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
ilyess_kira Messages postés 45 Date d'inscription mercredi 9 mai 2012 Statut Membre Dernière intervention 6 décembre 2012
6 juin 2012 à 15:43
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
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
6 juin 2012 à 16:22
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
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
6 juin 2012 à 16:37
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
ilyess_kira Messages postés 45 Date d'inscription mercredi 9 mai 2012 Statut Membre Dernière intervention 6 décembre 2012
6 juin 2012 à 16:40
ah cool du coup est-ce que tu peux me passe le bon code qui fonctionne stp?
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
Modifié par heyquem le 6/06/2012 à 17:33
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