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
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
A voir également:
- Expression régulière [python]
- Citizen code python avis - Accueil - Outils
- Expression de recherche - Guide
- Tu es un amour expression ✓ - Forum Loisirs / Divertissements
- Python retour à la ligne dans le code - Forum Python
3 réponses
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
Modifié par heyquem le 6/06/2012 à 12:11
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 ??
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 ??
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
Modifié par heyquem le 6/06/2012 à 12:26
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:
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')
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
6 juin 2012 à 14:00
j'ai essayé avec ta regex .. et ça ne m'affiche pas ce que je veux
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
6 juin 2012 à 14:03
6 juin 2012 à 14:03
ben dis plutôt ce que ça t'affiche
et ce que tu veux !!
et ce que tu veux !!
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
6 juin 2012 à 14:04
6 juin 2012 à 14:04
d'autre part si tu pouvais répondre à ma question qui se trouve dans ma première réponse............
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
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
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
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
6 juin 2012 à 14:27
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 ?
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
Modifié par heyquem le 6/06/2012 à 15:37
Modifié par heyquem le 6/06/2012 à 15:37
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
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
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 ?
je voulais te demander ausssi s'il n'y a pas moyen de spliter tous un texte ? ce serait plus façile non ?
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
6 juin 2012 à 16:22
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
je suis en train de chercher
tu peux spliter les ligne avec splitlines(), oui
mais ça ne sera pas plus simple à mon avis
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
6 juin 2012 à 16:37
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
encore une idiotie de ma part
j'avais mis [^ ]+ au lieu de [^\n]+ dans un pattern de regex
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
6 juin 2012 à 16:40
ah cool du coup est-ce que tu peux me passe le bon code qui fonctionne stp?
heyquem
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
131
Modifié par heyquem le 6/06/2012 à 17:33
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
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)