Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python查找IPv4并忽略IPv6 IP地址_Python - Fatal编程技术网

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

使用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',

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

您有几个问题:

解析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地址中没有。