Python将逗号和连字符按wis顺序分隔到lint

2024-03-29 12:29:09 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是文件输出。在

IP:10.10.10.1-10.10.10.10

我需要按顺序发送IP地址到列表。我用了下面的脚本和它的作品很好。在

^{pr2}$

现在我的输入文件如下:

IP:10.10.10.11,10.10.10.2-10.10.10.10,10.10.10.13,10.10.10.10.14-10.10.10.16

现在我需要的列表ip范围如下:

['10.10.10.11', '10.10.10.2', '10.10.10.3', '10.10.10.4', '10.10.10.5', '10.10.10.6', '10.10.10.7', '10.10.10.8', '10.10.10.9', '10.10.10.10', '10.10.10.13', '10.10.10.14', '10.10.10.15', '10.10.10.16']

注意:顺序是指不按升序或降序排列。它取决于test5.txt文件

注意:test5.txt文件可能有随机输出一个例子是上面和下面是另外两个例子。在

  Example1:
  IP:10.10.10.1-10.10.10.10,10.10.10.20,10.10.10.10.14-10.10.10.16
  Example2:
  IP:10.10.10.1-10.10.10.16

Tags: 文件iptxt脚本列表顺序作品例子
3条回答

您可以使用split

ip = 'IP:10.10.10.11,10.10.10.2-10.10.10.10,10.10.10.13,10.10.10.10.14-
ip_address = ip.split('IP:')[-1]
result = []
for item in ip_address.split(','):
    if '-' in item:
        start,end = map(lambda x:int(x.split('.')[-1]),item.split('-'))
        start_ip = '.'.join(item.split('-')[0].split('.')[:-1])
        result += [start_ip+'.'+str(i) for i in range(start,end+1)]
    else:
        result.append(item)

结果

^{pr2}$

让我们定义两个函数:一个将IP地址转换为32位整数(实际上是这样),另一个将整数转换为IP地址字符串。在

def ip_to_int(ip):
    return sum(int(octet) * 256**(i) for i,octet in enumerate(reversed(ip.split('.'))))

def int_to_ip(x):
    ip = []
    for i in range(3,-1,-1):
        octet, x = divmod(x, 256**i)
        ip.append(str(octet))
    return '.'.join(ip)

我们可以用IP函数来转换这些整数范围。如果出现10.10.10.250-10.10.11.3,这还可以处理范围。在

^{pr2}$

一些测试:

^{3}$

一种方法是将IP地址转换回一个数字,然后计数,直到使用了整个数字范围。这也适用于10.0.1.250-10.0.2.5

import socket
import struct

ip_addresses = []

with open("test5.txt") as f_input:
    for line in f_input:
        if line.startswith('IP:'):
            for entry in line.split(':')[1].split(','):
                ip_range = entry.split('-', 1)

                if len(ip_range) == 2:
                    start_ip = struct.unpack('>L', socket.inet_aton(ip_range[0].replace('-', '.')))[0]
                    end_ip = struct.unpack('>L', socket.inet_aton(ip_range[1].replace('-', '.')))[0]

                    while start_ip <= end_ip:
                        ip_addresses.append(socket.inet_ntoa(struct.pack('>L', start_ip)))
                        start_ip += 1
                else:
                    ip_addresses.append(ip_range[0])

print ip_addresses

因此,如果test5.txt包含:

^{pr2}$

您将得到以下输出:

^{3}$

^{}接受字符串格式的IP地址并将其转换为二进制格式。^{}接受压缩二进制格式的数字并将其转换为数字,例如0.0.0.1将转换为1。然后,脚本只需正常计数,直到到达结束编号,每次都要反向转换,以字符串格式重新创建IP地址。在

相关问题 更多 >