使用迭代器和重新python

时间:2017-06-16 12:11:58

标签: python regex python-2.7 iterator

我有一个程序告诉我今天谁将过生日。
我将姓名和生日存储在名为data.txt的文本文件中 以下是data.txt的示例:

Master 13/12 
Monkey 16/06
Michael 16/06
mike  01/05
Minita 24/06
Mom 12/06

以下是该计划:

from __future__ import print_function
import time

logic = time.strftime("%d/%m")
err_occur = []                        
pattern = re.compile(logic, re.IGNORECASE)
try:
    with open ('data.txt', 'rt') as in_file:         
        for linenum, line in enumerate(in_file):        
            if pattern.search(line) != None:         
                err_occur.append((linenum, line.rstrip('\n')))
                for linenum, line in err_occur:             
                    print("Line ", linenum, ": ", line, sep='')
except IOError:
    print ("data.txt Not found")

如果我运行此程序,如果今天的日期是16/06,则其输出应为

Line 3: Monkey 16/06
Line 4: Michael 16/06

然而,它显示的输出仅为

Line 3: Monkey 16/06

我想for...in声明无效? 他们不应该在一个循环中工作吗?

自从我学习python以来只有几天了。我还没有完全理解迭代器。因此,如果你能用外行术语来解释我的错误,那将是非常有用的。

编辑 - 感谢@zwer指出我的错误,并感谢@Coldspeed提供更有效的解决方案。

2 个答案:

答案 0 :(得分:1)

有一种更简单的方法可以逐个获得这些匹配的行。您可以使用re.finditer。它返回一个匹配的生成器:

from __future__ import print_function
import re
import time

s = open('data.txt', 'rt').read()

logic = time.strftime("%d/%m")
err_occur = []                        
for m in re.finditer('(.*?)[\s]*' + logic, s, re.M | re.IGNORECASE):
    print(m.group(0))

输出

Monkey 16/06
Michael 16/06

这不会在输出中给你Line x。如果你想要,你可能需要稍微改变一下。

答案 1 :(得分:1)

为什么在读取文件时会进行双循环?如果您想按照自己的方式构建它,只需打印出匹配的行:

gmdate