为什么Python re finditer()group()属性仅在解释器的第一次调用时返回匹配?

时间:2013-10-10 04:05:42

标签: python regex

有人可以解释为什么print match.group()仅在下面的for循环中第一次调用时返回结果匹配?我希望它每次调用时都会打印匹配。我在Python Docs:Regex HOWTO

中浏览this section时遇到了这个例子
Python 2.7.2 (default, Oct 11 2012, 20:14:37) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> p = re.compile('\d+')
>>> iterator = p.finditer('12 drummers, 11 pipers, 10 dancers')
>>> iterator
<callable-iterator object at 0x107deabd0>
>>> for match in iterator:
...  print match.group()
... 
12
11
10
>>> for match in iterator:
...  print match.group()
... 
>>> 

2 个答案:

答案 0 :(得分:1)

p.finditer()返回一个产生匹配的迭代器。一旦迭代器一直运行一次,迭代器就会耗尽。这与你这样做是一样的:

>>> l = [1, 2, 3]
>>> it = iter(l)
>>> for val in it:
    print val
1
2
3
>>> for val in it:
    print val
>>>

也就是说,你永远不会在第二个for循环中调用match.group()。如果你是,并且它没有返回任何内容,你应该期望看到一些None打印出来。

答案 1 :(得分:0)

这是python documentation for iterator描述的行为。

引用文档:

  

协议的意图是迭代器的next()方法   提出StopIteration,它将继续在后续调用中这样做。   不遵守此属性的实现被视为已损坏。

您在第一个for ... in循环中读取了迭代器中的所有项目,因此没有任何内容可供阅读。

如果你想再次参加比赛,你需要获得一个新的迭代器:

>>> iterator = p.finditer('12 drummers, 11 pipers, 10 dancers')