2013-06-05 151 views
0

我試圖將該代碼作爲docs.python提到:的Python finditer()輸出混亂

>>> iterator = p.finditer('12 drummers drumming, 11 ... 10 ...') 
>>> for match in iterator: 
...  print (match.span()) 
... 
(0, 2) 
(22, 24) 
(29, 31) 

其中p定義爲

p = re.compile('\d+') 

但是12,11和10都是兩位數字數字。那麼它爲什麼會顯示0-2,22-24,29-31? 這是怎麼處理這個輸出。如果有什麼好處?

+1

你在哪裏定義了'p'?它是什麼? – thegrinner

+0

'p = re.compile('\ d +')'。它是正則表達式HOWTO的[本節]的末尾(http://docs.python.org/3/howto/regex.html?highlight=drummers%20drumming#performing-matches)。 – Kevin

回答

4

跨度很好地映射到切片上。即結束索引,不包含

>>> ['12 drummers drumming, 11 '[slice(*i)] for i in ((0,2), (22,24))] 
['12', '11'] 
4

如在該文檔也指出:

跨度()返回含有 匹配

的(開始,結束)的位置的元組

優選使用match.group來顯示匹配內容

>>> iterator = p.finditer('12 drummers drumming, 11 ... 10 ...') 
>>> for match in iterator: 
    print match.group(), match.span() 



12 (0, 2) 
11 (22, 24) 
10 (29, 31) 
+0

Emmanuel感謝您的回覆&Im對不起,如果我didint正確地把它,但我的問題是,不應該開始和結束索引是 - (0,1); (22,23); (29,30),因爲數字的長度只有兩個。而(0,2)則意味着數字長度爲3. – sunita

+0

哦,對不起,起始索引是_included_,而結束索引是_excluded_ - 這與切片記法相同:'t [1:3]'只返回2個字符(索引1和2),而不是3! – Emmanuel

1

綜觀span()start()end()文檔,span()返回本場比賽的起點和終點的元組。

對於MatchObject m,返回2元組(m.start(group),m.end(group))。請注意,如果組沒有參與匹配,則爲(-1,-1)。組默認爲零,整個比賽。

start()end()是指明瞭匹配的子存在的指標。

返回按組匹配的子串的開始和結束的索引;組默認爲零(意味着整個匹配的子字符串)。

所以match.span()將只返回那個元組。如果您想顯示實際的匹配項,請嘗試match.group()