Python re.search() 不返回完整匹配组

4 投票
3 回答
689 浏览
提问于 2025-04-17 08:31
import re

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

:0000:0000

我正在尝试找出由冒号分隔的最长四个零的序列。这个字符串里有三个这样的组,但只打印了两个组。为什么呢?

补充说明:它打印的是:0000:0000,因为这是字符串中第一个匹配的结果——但我以为正则表达式总是寻找最长的匹配呢?

3 个回答

0

我正在使用 Python 2.7.3
你觉得用 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()
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

我相信这个方法可以简化得更优雅一些,但我觉得这样已经能表达出重点了。

2

答案已更新,以适应Python 2.6版本:

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

撰写回答