为什么Python re finditer()group()属性只在解释器中第一次调用时返回匹配项?
有人能解释为什么print match.group()只在下面的for循环中第一次调用时返回结果匹配吗?我希望它每次调用时都打印匹配。我在阅读Python文档时遇到了这个例子:Regex HOWTO为什么Python re finditer()group()属性只在解释器中第一次调用时返回匹配项?,python,regex,Python,Regex,有人能解释为什么print match.group()只在下面的for循环中第一次调用时返回结果匹配吗?我希望它每次调用时都打印匹配。我在阅读Python文档时遇到了这个例子: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",
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()
...
>>>
Python 2.7.2(默认,2012年10月11日20:14:37)
达尔文的[GCC 4.2.1兼容Apple Clang 4.0(标签/Apple/Clang-418.0.60)]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>进口稀土
>>>p=重新编译('\d+'))
>>>迭代器=p.finditer('12名鼓手,11名吹笛手,10名舞者')
>>>迭代器
>>>对于迭代器中的匹配:
... 打印match.group()
...
12
11
10
>>>对于迭代器中的匹配:
... 打印match.group()
...
>>>
>>> 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
。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
s打印出来。这是python描述的行为
引用文件:
该协议的目的是一旦迭代器的next()方法
引发StopIteration,它将在后续调用中继续这样做。
不遵守此属性的实现将被视为已损坏
您在第一个中读取了迭代器中的所有项,用于。。。在
循环中,因此没有任何内容可供阅读
如果要再次进行匹配,则需要获得一个新的迭代器:
>>> iterator = p.finditer('12 drummers, 11 pipers, 10 dancers')
这是python描述的行为 引用文件: 该协议的目的是一旦迭代器的next()方法 引发StopIteration,它将在后续调用中继续这样做。 不遵守此属性的实现将被视为已损坏 您在第一个
中读取了迭代器中的所有项,用于。。。在
循环中,因此没有任何内容可供阅读
如果要再次进行匹配,则需要获得一个新的迭代器:
>>> iterator = p.finditer('12 drummers, 11 pipers, 10 dancers')
不得不把这个给@Carl,因为他引用了Python文档中的答案。不过我还是给了你一张第一票。@JamesNicholson:当然,谢谢。很高兴知道这是指定的行为必须把这个给@Carl,因为他引用了Python文档中的答案。不过我还是给了你一张第一票。@JamesNicholson:当然,谢谢。很高兴知道它是指定的行为如果您重复使用匹配可能会使用re.findall:>>>>导入re>>>>p=re.compile('\d+')>>>mylist=p.findall('12个鼓手,11个吹笛手,10个舞者')>>打印mylist['12',11',10']>>如果您重复使用匹配可能会使用re.findall:>>导入re>>p=re.compile('\d+'))>>>mylist=p.findall('12名鼓手,11名吹笛手,10名舞者')>>>打印mylist['12','11','10']>>