2013-06-05 80 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()