re.search()再次调用时返回None

时间:2014-12-15 21:36:32

标签: python regex

这是我第一次在python中使用re包。

为了更好地理解它,我决定将一首诗复制到我的文件中,并使用不同的正则表达式来使用re.search()。

我从以下网站收到了这首诗并将其复制到我的文本文件中: http://www.poets.org/poetsorg/poem-day

我还提到了thisthisthisthis,以帮助解决我的问题。

以下是我的代码:

searchFile = open ('/Users/admin/Documents/Python/NLP/Chapter1-TextSample.txt', 'r')

for line in searchFile:
    if re.search('[pP]igeons', line):
        print line

The pigeons ignore us gently as we
scream at one another in the parking
lot of an upscale grocer. 

Pigeons scoot,and finches hop, and cicadas shout and shed
themselves into loose approximations of what
we might have in a different time called heaven.


for line in searchFile:
    if re.search('[pP]igeons', line):
        print line


for line in searchFile:
    print line

正如您所看到的,当我第一次搜索时,我得到了正确的结果。没问题。但是,一旦我再次进行相同的搜索,或者即使我只是尝试打印文件的行,也没有任何显示。但是,当我检查'searchFile'对象时,它仍然存在,如下所示:

In[23]:  searchFile
Out[23]: <open file '/Users/admin/Documents/Python/NLP/Chapter1-TextSample.txt', mode 'r' at 0x103a85d20>

有人可以强调为什么会发生这种情况?我错过了什么吗?

3 个答案:

答案 0 :(得分:3)

您已到达文件的末尾。你应该能够做到这一点回到开头:

searchFile.seek(0)

答案 1 :(得分:1)

因为在第一个循环之后,您已到达文件的末尾。此外,您应该使用with()语句打开并自动关闭文件。

with open('.../Chapter1-TextSample.txt', 'r') as searchFile:
    for line in searchFile:
        if re.search('[pP]igeons', line):
            print line
    searchFile.seek(0)
    # loop again

答案 2 :(得分:1)

实际上,这个问题不是re,而是关于searchFile

当您从中读取文件或从中进行迭代时,您实际上正在使用该文件。参见:

>>> f = open("test")
>>> f.read()
'qwe\n'
>>> f.read()
''

您可以将文件读取一次变量,然后从那里使用它,例如:

l = searchFile.readlines()

for i in l:
   ...

for i in l:
   ...