2011-05-09 77 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 
相关问题