2010-07-30 5 views
1

Ceci est dans le prolongement de ma question précédente où je voulais compiler de nombreux modèles comme une expression régulière et après la discussion que je fait quelque chose comme çaMotif Trouver Regex après avoir fait re.findall

REGEX_PATTERN = '|'.join(self.error_patterns.keys()) 

self.error_patterns.keys() serait motif comme

: error: 
: warning: 
cc1plus: 
undefine reference to 
Failure: 

et faire

error_found = re.findall(REGEX_PATTERN,line) 

maintenant, quand Je l'ai exécuté sur un fichier qui pourrait contenir un ou plusieurs motifs, comment puis-je savoir quel motif correspond exactement? Je veux dire que je peux quand même voir la ligne et trouver manuellement, mais veulent savoir si après avoir fait re.findall je peux trouver le motif comme re.group() ou quelque chose

Merci

Répondre

1

re.findall sera renvoie toutes les parties de texte correspondant à votre expression.

Si cela ne suffit pas pour identifier le motif sans ambiguïté, vous pouvez toujours effectuer une seconde opération re/match par rapport aux différents sous-motifs que vous avez joints(). Au moment de l'application de votre expression régulière initiale, le matcher ne sait plus que vous l'avez composé de plusieurs sous-motifs, par conséquent il ne peut pas fournir d'informations plus détaillées sur le sous-masque correspondant.

Une autre option tout aussi complexe consisterait à placer chaque motif dans un groupe (...). Ensuite, re.findall retournera un tableau de valeurs None (pour tous les modèles non-correspondants), à l'exception du groupe qui correspond au modèle.

1

MatchObject possède une propriété lastindex qui contient l'index du dernier groupe de capture ayant participé à la correspondance. Si vous entourez chaque modèle dans son propre groupe de capture, comme ceci:

(: error:)|(: warning:) 

... lastindex vous diront que l'on adapté (en supposant que vous connaissez l'ordre dans lequel les motifs apparaissent dans l'expression régulière). Vous voudrez probablement utiliser finditer() (qui crée un itérateur de MatchObjects) au lieu de findall() (qui renvoie une liste de chaînes). Assurez-vous également qu'il n'y a aucun autres groupes de capture dans la regex, pour que votre indexation ne soit plus synchronisée.

Questions connexes