2017-03-31 39 views
3

所有重叠匹配的开始和结束索引,这是我原来的做法:蟒蛇3的regex - 查找的字符串

string = '1'*15  
result = re.finditer(r'(?=11111)', string)  # overlapped = True 
               # Doesn't work for me 
for i in result:        # python 3.5 
    print(i.start(), i.end()) 

它发现所有重叠的比赛,但未能得到正确的结束索引。 输出:

1 <_sre.SRE_Match object; span=(0, 0), match=''> 
2 <_sre.SRE_Match object; span=(1, 1), match=''> 
3 <_sre.SRE_Match object; span=(2, 2), match=''> 
4 <_sre.SRE_Match object; span=(3, 3), match=''> 
(and so on..) 

我的问题: 我怎样才能找到所有重叠的匹配,并得到所有的开始和结束指数权呢?

回答

3

您遇到的问题与消费(即添加匹配结果)没有文本的前瞻是zero-width assertion有关。这只是在字符串中的一个位置。因此,你所有的匹配开始和结束在字符串中的相同位置。

您需要一个带capturing group(即(?=(11111)))和访问开始和组的端包围先行图案(具有i.start(1)i.end(1)):

import re 
s = '1'*15  
result = re.finditer(r'(?=(11111))', s) 

for i in result: 
    print(i.start(1), i.end(1)) 

Python demo,它的输出是

(0, 5) 
(1, 6) 
(2, 7) 
(3, 8) 
(4, 9) 
(5, 10) 
(6, 11) 
(7, 12) 
(8, 13) 
(9, 14) 
(10, 15) 
+0

的样本那请问工作 - 我的坏。 – Bjango

+0

为什么你必须在“i.start(1)”和“i.end(1)”中键入'1'? 在我的脑海里“i.start()”应该够了,显然不是。 – Bjango

+0

你需要获得组1的开始和结束位置。 'i.start()'='i.start(0)',整个匹配的开始位置。匹配是一个空字符串,即字符串中的一个位置,但捕获组保存实际值。 –

1

你能比较一下这个实现,看看差异可能在哪里。

match = re.finditer(r'111','test111 end111 and another 111') 
for i in match: 
    print(i.start(),i.end() 

如果这不是为你工作好心分享你的数据

+0

我甚至不必运行它来告诉我那不是我正在寻找的东西。 – Bjango