Expression régulière [python]
ilyess_kira
Messages postés
45
Date d'inscription
Statut
Membre
Dernière intervention
-
ilyess_kira Messages postés 45 Date d'inscription Statut Membre Dernière intervention -
ilyess_kira Messages postés 45 Date d'inscription Statut Membre Dernière intervention -
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 :
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
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:
- Expression régulière [python]
- Citizen code python avis - Accueil - Outils
- Expression écrite cm1 cm2 télécharger gratuit - Télécharger - Éducatifs
- Microsoft expression encoder - Télécharger - Divers Utilitaires
- Python pix ✓ - Forum Python
- Mot secret python pix ✓ - Forum Python
3 réponses
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 ??
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 ??
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:
elles sont concaténées automatiquement, d'où
raton-laveur
Par ailleurs, entre parenthèses, les retours à la ligne ne comptent pas, donc écrire
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')
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
et merci
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
Je suis idiot.
J'ai fait tourner le code suivant:
Le résultat est:
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
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
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
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)