使用Python查找IPv4并忽略IPv6 IP地址
我有以下格式中提到的字符串,我只想从字符串中删除IPv6地址,并将IPv4地址作为字符串打印。我尝试使用子字符串和正则表达式,但无法获得此字符串的正确正则表达式。谁能帮忙提供解决方案呢 给定给python程序的输入字符串的实际格式如下所示,包括格式方括号,其中Ipv6地址可以出现在字符串的开头或结尾使用Python查找IPv4并忽略IPv6 IP地址,python,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: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"
您有几个问题: 解析python格式的列表:对每一行使用ast.literal\u eval 过滤掉正确的地址。一个好的标准是检查冒号不在字符串中。 我的方法是一行,使用next和生成器返回每行中唯一的或空字符串有效字符串:
text="""['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']""".splitlines()
import ast
result = [next((x for x in ast.literal_eval(line) if ":" not in x),"") for line in text]
print(result)
印刷品:
['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']
结果是一个python列表,所以打印不带括号的行和所有行只需要一个循环或str.join即可。您有几个问题: 解析python格式的列表:对每一行使用ast.literal\u eval 过滤掉正确的地址。一个好的标准是检查冒号不在字符串中。 我的方法是一行,使用next和生成器返回每行中唯一的或空字符串有效字符串:
text="""['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']""".splitlines()
import ast
result = [next((x for x in ast.literal_eval(line) if ":" not in x),"") for line in text]
print(result)
印刷品:
['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']
结果是一个python列表,所以打印不带括号的行和所有行只需要一个循环或str.join首先,这是一个技术细节,但请注意,在您的列表中,没有一个地址在技术上是有效的IPv4,因为后面的斜杠,我假设它表示一个。在DocsforPython模块中,您可以找到有效地址的组成说明
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
也就是说,如果您想在这里更全面地了解,而不仅仅是检查:按照注释中的建议,删除范围,然后尝试实例化一个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')
首先,这是一个技术细节,但请注意,在您的列表中,没有一个地址在技术上是有效的IPv4,因为后面的斜杠,我假设它表示一个。在DocsforPython模块中,您可以找到有效地址的组成说明
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
也就是说,如果您想在这里更全面地了解,而不仅仅是检查:按照注释中的建议,删除范围,然后尝试实例化一个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')
您可以使用double::轻松检测所有值并删除它们
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']您可以使用double::轻松检测并删除所有值
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']我认为没有必要乱用正则表达式。只要试着用if:notin检查字符串就可以了。为什么字符串是这样打印的?您可以使用ast.literal_evalline[1]这样做,但最好的方法是更改输入文件格式,这一点不难理解。IPv6地址中有:,IPv4地址中没有。我认为没有必要乱用正则表达式。只要试着用if:notin检查字符串就可以了。为什么字符串是这样打印的?您可以使用ast.literal_evalline[1]这样做,但最好的方法是更改输入文件格式,这一点不难理解。IPv6地址中有:,IPv4地址中没有。