有人可以解释为什么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()
...
>>>
答案 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')