2009-11-09 6 views
1

Comment utilisez-vous une expression régulière avec une boucle en Pythonregex en boucle

example data 
abc 1 xyz 0 
abc 2 xyz 1 
abc 3 xyz 2 

Comment écrivez-vous regex quelque chose comme ci-dessous

for i in range(1, 3): 
    re.match(abc +i xyz +(i-1)) 
+1

Quel est le problème avec votre exemple de code (sauf qu'il manque une parenthèse fermante et quelques guillemets)? –

+0

nouveau à python et regex, il y a un problème avec la variable "i" où regex traitant comme lettre. – user204488

+0

Veuillez poster l'expression rationnelle que vous avez essayée. Quand vous dites "problème avec la variable" i ", veuillez écrire l'erreur traceback et la regex avec le problème. S'il vous plaît fournir des détails de ce qui ne fonctionne pas pour vous. –

Répondre

3

Ce remplace i dans la première %s et i-1 dans la seconde %s

re.match("abc %s xyz %s"%(i,i-1), data) 

une autre façon d'écrire serait

re.match("abc "+str(i)+" xyz "+str(i-1), data) 
+0

merci pour l'information – user204488

2

Vous ne pouvez pas faire une seule regex qui comprend des expressions mathématiques qui sont évalués au moment de la correspondance des expressions rationnelles. Cependant, vous pouvez générer dynamiquement des expressions regex, en utilisant les techniques de mise en forme habituelles de chaîne Python:

import re 

example_data = """ 
this line will not match 
abc 1 xyz 0 
this line will not match 
abc 2 xyz 1 
abc 2 xyz 2 will not match 
abc 3 xyz 2 
""" 

for i in range(1, 4): 
    pattern = "abc %d xyz %d" % (i, (i - 1)) 
    match_group = re.search(pattern, example_data) 
    if match_group: 
     print match_group.group(0) 

Cela imprimer:

abc 1 xyz 0 
abc 2 xyz 1 
abc 3 xyz 2 

Il est peut-être une meilleure idée de le faire comme le suggère abyx, et faire un motif unique regex avec plusieurs groupes de match, et faire le calcul sur la base des sous-chaînes capturées par les groupes de match:

import re 

example_data = """ 
this line will not match 
abc 1 xyz 0 
this line will not match 
abc 2 xyz 1 
abc 2 xyz 2 will not match 
abc 3 xyz 2 
""" 
s_pattern = "abc (\d+) xyz (\d+)" 

pat = re.compile(s_pattern) 
# note that you can pre-compile the single pattern 
# you cannot do that with the dynamic patterns 

for match_group in re.finditer(pat, example_data): 
    n1 = int(match_group.group(1)) 
    n2 = int(match_group.group(2)) 
    if n1 > 0 and n1 == n2 + 1: 
     print match_group.group(0) 

Cela permettra également imprimer:

abc 1 xyz 0 
abc 2 xyz 1 
abc 3 xyz 2