使用Python查找IPv4并忽略IPv6 IP地址

时间:2018-02-26 04:21:38

标签: python

我有以下格式中提到的字符串,我想从字符串中仅删除IPv6地址,并仅将IPv4地址作为字符串打印。我尝试使用子字符串和正则表达式,但我无法为此字符串获得正确的正则表达式。任何人都可以帮助提供解决方案。

给予python程序的输入字符串的实际格式如下格式(包括方括号),其中Ipv6地址可以出现在字符串的开头或结尾。

['fe80::2ff:fe21:30f/64', '17.2.1.2/24']
['fe80::2ff:fee4:2b43/64', '17.2.1.3/24']
['17.2.10.2/24', 'fe80::2ff:fe42:f251/64]
['192.168.4.1/30', 'fe80::2ff:fe19:cdd7/64']
['fe80::2ff:fe1e:e328/64', '17.2.4.1/24']

输出应显示为仅作为字符串的ipv4地址

   "17.2.1.2/24"
   "17.2.1.3/24"
   "17.2.10.2/24"
   "192.168.4.1/30"
   "17.2.4.1/24"

2 个答案:

答案 0 :(得分:3)

首先,这是一个技术细节,但请注意,在您的列表中,没有一个地址在技术上是有效的IPv4,因为尾部斜杠(我假设,它表示range)。在Python的ipaddress模块的文档中,您可以找到有效地址的描述。

那就说了一下,如果你想在这里彻底阅读(而不是只是检查注释中建议的“:”,删除范围,然后尝试实例化ipaddress.IPv4Address类如果失败,则表示您没有有效的地址。

from ipaddress import IPv4Address, AddressValueError

addresses = ['fe80::2ff:fe21:30f/64', '17.2.1.2/24',
             'fe80::2ff:fee4:2b43/64', '17.2.1.3/24',
             '17.2.10.2/24', 'fe80::2ff:fe42:f251/64',
             '192.168.4.1/30', 'fe80::2ff:fe19:cdd7/64',
             'fe80::2ff:fe1e:e328/64', '17.2.4.1/24']

def is_ipv4_only(addr):
    try:
        IPv4Address(addr.split('/')[0])
        return True
    except AddressValueError:
        return False

for address in addresses:
    if is_ipv4_only(address):
        print(address)

17.2.1.2/24
17.2.1.3/24
17.2.10.2/24
192.168.4.1/30
17.2.4.1/24

或者(这是一种矫枉过正的行为)你可以使用正则表达式来实现IPv4。 (IPv6正则表达式方式比这更毛茸茸;我看到人们对它进行了刺激,但我不是其中之一。)

ipv4 = re.compile(r'\b(([0]{1,2}[0-7]|[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0]{1,2}[0-7]|[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b')

答案 1 :(得分:0)

您可以使用双 :: 轻松检测所有值并删除它们。

mlist = ['fe80::2ff:fe21:30f/64', '17.2.1.2/24', 'fe80::2ff:fee4:2b43/64', '17.2.1.3/24']
ipv4 = []
for cidr in mlist:
    if not "::" in cidr:
        ipv4.append(cidr)
print(ipv4)

输出:['17.2.1.2/24', '17.2.1.3/24']

相关问题