2010-06-23 6 views
1

Je crée une boucle for dans une boucle for. Je parcours une liste et trouve une chaîne spécifique qui contient un modèle d'expression régulière. Une fois que je trouve la ligne, je dois chercher pour trouver la ligne suivante d'un certain motif. J'ai besoin de stocker les deux lignes pour être en mesure d'analyser le temps pour eux. J'ai créé un compteur pour suivre le numéro d'index de la liste lorsque la boucle externe fonctionne. Puis-je utiliser une construction comme celle-ci pour trouver la deuxième ligne dont j'ai besoin?indexer une liste dans une boucle Python

index = 0 
for lineString in summaryList: 
    match10secExp = re.search('taking 10 sec. exposure', lineString) 
    if match10secExp: 
     startPlate = lineString 
     for line in summaryList[index:index+10]: 
      matchExposure = re.search('taking \d\d\d sec. exposure', line) 
      if matchExposure: 
       endPlate = line 
      break 
    index = index + 1 

Le code s'exécute, mais je n'obtiens pas le résultat que je recherche.

Merci.

+0

Vous pouvez également inclure le code de la boucle externe. – Amber

+0

Au lieu de compter manuellement, vous pouvez faire ceci: 'pour index, line dans enumerate (summaryList):' – Amber

Répondre

1
matchExposure = re.search('taking \d\d\d sec. exposure', lineString) 

devrait probablement

matchExposure = re.search('taking \d\d\d sec. exposure', line) 
+0

Je pense que vous avez raison, mais j'ai corrigé cela et cela ne produira toujours pas la bonne sortie. Je mets une ligne d'impression dans la première instruction if et rien n'est en cours d'impression. – Hannah

+0

Est-ce que la seconde ligne que vous recherchez est toujours à 3 chiffres pour le temps d'exposition? (De plus, vous pouvez utiliser '\ d {3}' au lieu de '\ d \ d \ d'.) – Amber

1

En fonction de vos besoins, vous pouvez simplement utiliser un itérateur sur la liste, ou deux d'entre eux comme mae par itertools.tee. Par exemple, si vous voulez rechercher des lignes suivant le premier motif que pour le second motif, un iterator fera:

theiter = iter(thelist) 

for aline in theiter: 
    if re.search(somestart, aline): 
    for another in theiter: 
     if re.search(someend, another): 
     yield aline, another # or print, whatever 
     break 

Ce sera pas lignes de recherche de aline à la désinence another pour somestart, seulement pour someend. Si vous avez besoin de les chercher à des fins, par exemple, laisser theiter lui-même intact pour la boucle extérieure, c'est là tee peut aider:

for aline in theiter: 
    if re.search(somestart, aline): 
    _, anotheriter = itertools.tee(iter(thelist)) 
    for another in anotheriter: 
     if re.search(someend, another): 
     yield aline, another # or print, whatever 
     break 

Ceci est une exception à la règle générale sur tee que les docs donnent:

une fois tee() a fait une scission, le d'origine itérables ne doit pas être utilisé nulle part ailleurs; sinon, l'itérable pourrait être avancée sans que le tee ne soit informé.

parce que l'avancement de theiter et celle de anotheriter se produire dans des parties disjointes du code, et anotheriter est toujours reconstruit à nouveau en cas de besoin (pour l'avancement de theiter dans l'intervalle n'est pas pertinent).

Questions connexes