2011-12-16 2 views
4
import re 

ip6 = "1234:0678:0000:0000:00cd:0000:0000:0000" 
zeroes = re.search("(:?0000)+", ip6) 
print zeroes.group(0) 

:0000:0000 

콜론으로 구분 된 4 개의 0 중에서 가장 긴 시퀀스를 찾으려고합니다. 문자열에는 이러한 세 개의 그룹이 포함되지만 두 개의 그룹 만 인쇄됩니다. 왜?파이썬 re.search()가 전체 그룹 일치를 반환하지 않습니다.

편집 : 0000 : 그것은 인쇄의 0000 그 문자열의 경기이기 때문에 -하지만 난 항상 일치를 보았다 regexps '에 생각? 파이썬 2.6에서 작동하도록 업데이트

+0

이 변경 사용에 대한 파이썬 2.7.3
을 사용하고 있습니다 (^ 0000 | : 0000) (? : 0000)에 –

+0

사실, NFA 정규식 엔진 (예 : Python의 경우)은 항상 "가장 긴 _left-most_"일치를 반환합니다. – ridgerunner

+0

@ridgerunner 저것을위한 근원? –

답변

2

답변 :이 정규 표현식에 붙어하지 않는 경우

p = re.compile('((:?0000)+)') 
longestword = "" 
for word in p.findall(ip6): 
    if len(word[0])>len(longestword): 
     longestword = word[0] 
print longestword 
+1

(:? 0000) + ------ –

+0

그 목록 이해력은 등호에 구문 오류를줍니다. 파이썬 3 일인가요? –

+0

파이썬 3의 * my * 인스턴스에서는 작동하지 않으므로 그렇지 않습니다. –

2

, 당신이 사용할 수 itertools.groupby :

from itertools import groupby 

ip6 = "1234:0678:0000:0000:00cd:0000:0000:0000" 

longest = 0 
for section, elems in groupby(ip6.split(':')): 
    if section == '0000': 
     longest = len(list(elems)) 

print longest # Prints '3', the number of times '0000' repeats the most. 
       # you could, of course, generate a string of 0000:... from this 

나는이 비등 할 수 있습니다 확신 해요 좀 더 우아한 것으로 내려갔습니다. 그러나 나는이 점을 전달한다고 생각합니다.

0

내가 어떻게 re.finditer()

$ uname -r 
3.2.0-4-amd64 


#!/usr/bin/env python 

import re 

ip6 = "1234:0678:0000:0000:00cd:0000:0000:0000" 

iters = re.finditer("(:?0000)+", ip6) 
for match in iters: 
    print 'match.group() -> ',match.group() 
관련 문제