使用迭代器和 re python 提取特定信息



我有一个程序告诉我今天谁会过生日。
我的名字和生日存储在一个名为 data.txt 的文本文件中。
下面是一个数据示例.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提供更有效的解决方案。

有一种更简单的方法可以逐个获取这些匹配的行。您可以使用 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。如果你想要这样,你可能需要稍微改变一下。

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

from __future__ import print_function
import re
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:
                line = line.rstrip("n")
                print("Line ", linenum + 1, ": ", line, sep='')
                err_occur.append((linenum + 1, line))
except IOError:
    print ("data.txt Not found")
# Line 2: Monkey 16/06
# Line 3: Michael 16/06

最新更新