我有以下格式中提到的字符串,我想从字符串中仅删除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"
答案 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']