2011-12-16 18 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つのゼロの最長シーケンスを探しています。文字列には3つのグループのシーケンスが含まれていますが、2つのグループだけが印刷されます。どうして?Python re.search()が完全なグループ一致を返さない

EDIT:0000::それは印刷だ0000それは文字列の最初の試合だから - しかし、私はいつも最長マッチを探した正規表現を考えましたか? Pythonの2.6で動作するように更新

+0

が変更使用についてのPython 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

そのリストの理解は私に等号の構文エラーを与えます。それはpython3のことですか? –

+0

これはpython 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() 
関連する問題