2011-05-09 80 views
0

我的正則表達式工作,我試圖做的是有第一個讀取文件和打印每次有匹配(這工作),然後當它發現匹配第二個表達式爲它打印匹配。因此,在我導入的文件中,它會匹配所有數字,然後在找到「BREAK」後打印「BREAK」。我得到的是它在每次找到匹配的數字後打印「BREAK」。我的目標是在程序看到單詞'BREAK'後停止搜索匹配號碼。使用兩個正則表達式來搜索一個文件

 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)) 

任何想法?

+0

亞倫,該行'L = re.search(R '(BREAK)',文本)'啓動從文本的開始搜索,一次又一次,當發現一個新號碼時 – bpgergo 2011-05-09 16:01:52

+0

也許你應該添加一些樣本輸入文本和期望的輸出。從我的角度來看,你想要的東西並不簡單。我的猜測是,你想逐行閱讀你的文件,並檢查某一行是否與你的一個模式匹配。你也會想將_state_保存到一個變量中。所以你會知道你以前的比賽。希望這可以幫助。 – bpgergo 2011-05-09 16:06:13

+0

這裏是一些樣本輸入, 您好5月12日-1956 BREAK 月-12,2311 輸出將是1956年 – Aaron 2011-05-09 16:16:01

回答

1

問題是,當您搜索「BREAK」時,您正在搜索整個文本,而不是搜索到的數字後面顯示的文本。因此,如果文本中有任何「BREAK」,它總會被找到。

看起來好像finditer()可能不是最適合您情況的東西。最好自己循環遍歷文件的行,並且對循環有更多的控制權。

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

感謝我不得不發揮與它周圍一點使我的工作,但它的工作原理 – Aaron 2011-05-09 16:50:45

0

你顯然需要做的:

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) 

結果

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

000 
111 
222 
444 
555 
相關問題