2011-05-09 3 views
0

Mes deux expressions régulières fonctionnent, ce que j'essaie de faire est d'avoir le premier lire le fichier et imprimer chaque fois qu'il y a une correspondance (cela fonctionne), puis quand il trouve une correspondance pour la deuxième expression imprime une correspondance pour cela. Donc, dans le fichier que j'importe, il va correspondre à tous les numéros puis une fois qu'il trouve 'BREAK', il imprime 'BREAK'. Ce que j'obtiens est qu'il imprime 'BREAK' après chaque numéro pour lequel il trouve une correspondance. Mon but est d'arrêter la recherche du numéro correspondant une fois que le programme voit le mot «BREAK».en utilisant deux expressions régulières pour rechercher un fichier

 for m in re.finditer(r'((((2)([0-3]))|(([0-1])([0-9])))([0-5])([0-9]))', text): 
     print(m.group(0)) 
     l=re.search(r'(BREAK)', text) 
     if l: 
      print(l.group(0)) 

Des idées?

+0

Aaron, cette ligne 'l = re.search (r '(BREAK)', texte)' commence la recherche à partir du début du texte, encore et encore, quand un nouveau nombre est trouvé – bpgergo

+0

Peut-être que vous auriez dû ajouter un petit exemple de texte d'entrée et de sortie attendue. Formez-moi ce n'est pas tout à fait simple ce que vous voulez. Je suppose que vous voulez lire votre fichier ligne par ligne, et vérifier si une certaine ligne correspond à l'un de vos modèles. Aussi, vous voudrez enregistrer _state_ dans une variable. Donc, vous connaîtrez vos matchs précédents. J'espère que cela t'aides. – bpgergo

+0

voici quelques échantillons d'entrée, Salut à 12 mai, -1956 PAUSE -12 Juin 2311 la sortie serait 1956 – Aaron

Répondre

1

Le problème est que lorsque vous recherchez "BREAK" vous recherchez le texte entier et non le texte qui apparaît après le numéro que vous avez trouvé. Pour cette raison, si le texte a "BREAK" n'importe où, il sera toujours trouvé.

Il semble que finditer() ne soit pas la meilleure solution pour votre situation. Il serait préférable de parcourir vous-même les lignes du fichier et vous aurez plus de contrôle sur la boucle.

with open("test.txt") as f: 
    for line in f: 
    if re.match("BREAK", line): 
     print("Break") 
     break 
    m = re.match(r'((((2)([0-3]))|(([0-1])([0-9])))([0-5])([0-9]))', line) 
    if m: 
     print(m.group(0)) 
+0

Merci que je devais jouer avec un peu de faire mon travail de code, mais il fonctionne – Aaron

0

Vous devez évidemment faire:

import re 

text = '''-- 000 == 111 ** 222 
@@ 444 ## 555 BREAK 666 ::: 
777 ,,, 888 &&&''' 

regx = re.compile('\d(\d)\d') 
brek = text.find('BREAK') 
li = [m.group() for m in regx.finditer(text,0,(brek if brek+1 else len(text)))] 
print li 
print 
print '\n'.join(li) 

résultat

['000', '111', '222', '444', '555'] 

000 
111 
222 
444 
555 
Questions connexes