2

谁能解释为什么 print match.group() 只在第一次在下面的 for 循环中调用时返回结果匹配?我希望它每次调用时都会打印匹配项。我在阅读 Python Docs 中的本节时遇到了这个例子:Regex HOWTO

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()
... 
>>> 
4

2 回答 2

2

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

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

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

于 2013-10-10T04:10:13.707 回答
2

这是 python文档iterator描述的行为。

引用文档:

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

您在第一个循环中读取了迭代器中的所有项目for ... in,因此没有什么可读取的了。

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

>>> iterator = p.finditer('12 drummers, 11 pipers, 10 dancers')
于 2013-10-10T04:15:12.750 回答