2013-10-10 21 views
0

任何人都可以解釋爲什麼打印match.group()只返回結果匹配第一次在for循環中調用下面?我希望它在每次調用時打印匹配。我遇到過這種例子在Python文檔經歷this section同時:正則表達式HOWTO爲什麼Python重新finditer()group()屬性只在解釋器中首次調用時返回匹配項?

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

這是由python documentation for iterator所描述的行爲。

引用文檔:

該協議的目的是,一旦一個迭代器的next()方法 引發StopIteration異常,它會繼續在後續調用這樣做。 不遵守此屬性的實施被視爲破壞。

您讀取第一個for ... in循環中迭代器中的所有項目,因此沒有剩下可讀的內容。

如果您想再次通過比賽,你需要得到一個新的迭代:

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

如果您反覆使用這些匹配,可能使用re.findall:>>> import re >>> p = re.compile('\ d +') >>> mylist = p。的findall('12鼓手,11個風笛,10名舞者 ') >>>打印MYLIST [' 12' , '11', '10'] >>> – rtrwalker

+0

@rtrwalker,這是一個很好的建議。 –

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打印出來。

+0

只好給這一個@Carl,因爲他引用了Python文檔他的答案。儘管第一個給你一個upvote。 –

+0

@JamesNicholson:當然,謝謝。很高興知道這是指定的行爲 – Claudiu

相關問題