使用正则表达式匹配IP地址

时间:2011-05-18 11:09:36

标签: python regex

我正在尝试匹配简化版本的IP地址(我相信这种模式应该匹配所有IP地址,然后是一些不是IP地址的东西,但这并不重要。)我正在使用这种语法的Python:

'([0-9]{1,3}\.){3}[0-9]{1,3}'

然而,这与“127”相匹配。据我所知,它将我所提供的内容解释为模式列表而不是单个模式列表。我错过了什么?

更新:是的,对不起大家,我有一个错字。我修好了。

每个人都说这种模式是完美的,但我没有得到。也许我的问题出在其他地方:

        matches = regex.findall(line)
        for match in matches:
            matchList.add(label + match)

如果我使用模式'('\ d {1,3}。\ d {1,3}。\ d {1,3}。\ d {1,3}'(相同的,我只是重复,这完美地工作并提供一个完整的IP地址。但是,如果我使用上面的模式,它反而给出'195。'

如果我在这个表达式周围加上'((\ d {1,3}。){3} \ d {1,3})',标签+匹配给我错误'无法连接字符串和元组对象'

4 个答案:

答案 0 :(得分:2)

快速回答,请改用:

(?:[0-9]{1,3}\.){3}[0-9]{1,3}

答案很长:

以127.0.0.1为例,您发布的正则表达式只匹配“0”。而不是完整的地址。您正在使用的括号创建一个匹配组,它告诉解析器确保找到整个模式,但只返回匹配()组中的内容,这将留下“127.0.0。”。加上正则表达式默认是贪婪的,并会自动选择最远/最后可能的匹配。因此,在这种情况下括号后面的{3}有点像索引,你最终会得到第三个匹配,因此“0”。

一组括号本身会创建一个匹配的组,但您想要的是一个不匹配的组。在我上面显示的第一个括号之后添加一个?:表示这个。这样它仍将返回整条线的匹配。这应该为您提供您正在寻找的“简化”正则表达式。

答案 1 :(得分:1)

也许你在发布时输了错误,但是当我使用你的正则表达时,它与“127”不符。或“127.0.0.1”。当我删除无关的反斜杠时,它似乎对我来说很好

In [22]: re.match(r'([0-9]{1,3}\.){3}[0-9]{1,3}', '127.0.0.1')
Out[22]: <_sre.SRE_Match object at 0x1013de5d0>

In [23]: re.match(r'([0-9]{1,3}\.){3}[0-9]{1,3}', '127.')

答案 2 :(得分:0)

试试这个

引自this

def is_valid_ipv4(ip):
    """Validates IPv4 addresses.
    """
    pattern = re.compile(r"""
        ^
        (?:
          # Dotted variants:
          (?:
            # Decimal 1-255 (no leading 0's)
            [3-9]\d?|2(?:5[0-5]|[0-4]?\d)?|1\d{0,2}
          |
            0x0*[0-9a-f]{1,2}  # Hexadecimal 0x0 - 0xFF (possible leading 0's)
          |
            0+[1-3]?[0-7]{0,2} # Octal 0 - 0377 (possible leading 0's)
          )
          (?:                  # Repeat 0-3 times, separated by a dot
            \.
            (?:
              [3-9]\d?|2(?:5[0-5]|[0-4]?\d)?|1\d{0,2}
            |
              0x0*[0-9a-f]{1,2}
            |
              0+[1-3]?[0-7]{0,2}
            )
          ){0,3}
        |
          0x0*[0-9a-f]{1,8}    # Hexadecimal notation, 0x0 - 0xffffffff
        |
          0+[0-3]?[0-7]{0,10}  # Octal notation, 0 - 037777777777
        |
          # Decimal notation, 1-4294967295:
          429496729[0-5]|42949672[0-8]\d|4294967[01]\d\d|429496[0-6]\d{3}|
          42949[0-5]\d{4}|4294[0-8]\d{5}|429[0-3]\d{6}|42[0-8]\d{7}|
          4[01]\d{8}|[1-3]\d{0,9}|[4-9]\d{0,8}
        )
        $
    """, re.VERBOSE | re.IGNORECASE)
    return pattern.match(ip) is not None

答案 3 :(得分:0)

在[0-9]之前是一个错字吗?

如果是这样,如果在整个表达式'(([0-9]{1,3}\.){3}[0-9]{1,3})'周围添加括号,您将创建一个捕获整个匹配的捕获组。否则你只是抓住你的一部分字符串。