在Python中检查字符串是否匹配IP地址模式?

59 投票
21 回答
147566 浏览
提问于 2025-04-16 02:39

检查一个字符串是否符合某种模式的最快方法是什么?正则表达式是最好的选择吗?

举个例子,我有一堆字符串,想要检查每一个是否是有效的IP地址(这里的有效是指格式正确),使用正则表达式是最快的方法吗?还是有其他更快的方法,比如用字符串格式化之类的。

我到目前为止一直在做的事情是这样的:

for st in strs:
    if re.match('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', st) != None:
       print 'IP!'

21 个回答

17

在Python 3.6中,我觉得这要简单得多,因为已经包含了ipaddress模块:

import ipaddress

    def is_ipv4(string):
        try:
            ipaddress.IPv4Network(string)
            return True
        except ValueError:
            return False
57

如果你使用的是Python3,可以使用ipaddress这个模块,具体的介绍可以查看这个链接:http://docs.python.org/py3k/library/ipaddress.html。下面是一个例子:

>>> import ipaddress

>>> ipv6 = "2001:0db8:0a0b:12f0:0000:0000:0000:0001"
>>> ipv4 = "192.168.2.10"
>>> ipv4invalid = "266.255.9.10"
>>> str = "Tay Tay"

>>> ipaddress.ip_address(ipv6)
IPv6Address('2001:db8:a0b:12f0::1')

>>> ipaddress.ip_address(ipv4)
IPv4Address('192.168.2.10')

>>> ipaddress.ip_address(ipv4invalid)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/lib/python3.4/ipaddress.py", line 54, in ip_address
    address)
ValueError: '266.255.9.10' does not appear to be an IPv4 or IPv6 address

>>> ipaddress.ip_address(str)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/lib/python3.4/ipaddress.py", line 54, in ip_address
    address)
ValueError: 'Tay Tay' does not appear to be an IPv4 or IPv6 address
104

更新

下面的原回答在2011年是不错的,但自2012年以来,使用Python的ipaddress标准库模块可能会更好。除了检查IPv4和IPv6的IP地址有效性外,它还能做很多其他事情。


看起来你是在尝试验证IP地址。使用正则表达式可能不是最好的选择。

如果你想接受所有有效的IP地址(包括一些你可能不知道的有效地址),那么你可以使用IPy (来源)

from IPy import IP
IP('127.0.0.1')

如果IP地址无效,它会抛出一个异常。

或者你可以使用socket (来源)

import socket
try:
    socket.inet_aton(addr)
    # legal
except socket.error:
    # Not legal

如果你真的只想匹配有4个小数部分的IPv4地址,那么你可以用点号分割,并检查每一部分是否是0到255之间的整数。

def validate_ip(s):
    a = s.split('.')
    if len(a) != 4:
        return False
    for x in a:
        if not x.isdigit():
            return False
        i = int(x)
        if i < 0 or i > 255:
            return False
    return True

注意,你的正则表达式并没有做这个额外的检查。它会把999.999.999.999当作有效地址。

撰写回答