如何用端口号对IP地址排序?

2024-05-23 16:58:43 发布

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

我正在创建自己的报告工具,并试图找出如何将IP地址与端口号排序。你知道吗

如何使用端口号对IP地址进行排序,以便先对IP地址进行排序,然后再通过端口号进行排序。我能够很好地对IP地址进行排序,但是当与端口号结合使用时,它就变得很困难了。你知道吗

a = ['192.168.0.3 (443/tcp)|', '192.168.0.176 (443/tcp)|', '192.168.0.40 (443/tcp)|', '192.168.0.15 (8443/tcp)|', '192.168.0.16 (8443/tcp)|', '192.168.0.12 (443/tcp)|', '192.168.0.9 (3389/tcp)|', '192.168.0.15 (443/tcp)|', '192.168.0.16 (443/tcp)|', '192.168.0.3 (3389/tcp)|', '192.168.0.14 (443/tcp)|']

print(a.sort(key=lambda s: map(int, s.split('.')))) #this works fine with just IP address not with the current format of (xxx/tcp). The pipe is for delimiters so please ignore.

我想得到的输出排序的IP地址第一,然后为每个IP排序通过端口号。例如,前几个结果是:

a= ['192.168.0.3 (443/tcp)|', '192.168.0.3 (3389/tcp)|', 192.168.0.9 (3389/tcp)|, ...']

Tags: 工具lambdakeyipmap排序报告with
3条回答

您可以在一行中使用sorted这样做:

sorted(a, key=lambda x:x.split(' ')[0])

使用re.findall

import re

def get_ip_port(x):
    *ips, port = map(int, re.findall('\d+', x))
    return ips, port

sorted(a, key=get_ip_port)

输出:

['192.168.0.3 (443/tcp)|',
 '192.168.0.3 (3389/tcp)|',
 '192.168.0.9 (3389/tcp)|',
 '192.168.0.12 (443/tcp)|',
 '192.168.0.14 (443/tcp)|',
 '192.168.0.15 (443/tcp)|',
 '192.168.0.15 (8443/tcp)|',
 '192.168.0.16 (443/tcp)|',
 '192.168.0.16 (8443/tcp)|',
 '192.168.0.40 (443/tcp)|',
 '192.168.0.176 (443/tcp)|']

说明:

  • map(int, re.findall('\d+', x)):查找所有数字并使其成为int
  • *ips, port:将上面的int解包并重新打包到除最后一个(*ips)和最后一个(port)之外的所有文件中
  • sorted(a, key=get_ip_port):因为get_ip_port返回两个键(ipsport),所以sorted首先按ipsa排序,然后按需要对port排序。你知道吗

您可以使用多个条件进行排序(map(int,e[0].split('.'))作为条件1,int(e[1].lstrip('(').split('/')[0])作为条件2),如下所示

>>> a
['192.168.0.3 (443/tcp)|',
 '192.168.0.176 (443/tcp)|',
 '192.168.0.40 (443/tcp)|',
 '192.168.0.15 (8443/tcp)|',
 '192.168.0.16 (8443/tcp)|',
 '192.168.0.12 (443/tcp)|',
 '192.168.0.9 (3389/tcp)|',
 '192.168.0.15 (443/tcp)|',
 '192.168.0.16 (443/tcp)|',
 '192.168.0.3 (3389/tcp)|',
 '192.168.0.14 (443/tcp)|']
>>> [i.split() for i in a]
[['192.168.0.3', '(443/tcp)|'],
 ['192.168.0.176', '(443/tcp)|'],
 ['192.168.0.40', '(443/tcp)|'],
 ['192.168.0.15', '(8443/tcp)|'],
 ['192.168.0.16', '(8443/tcp)|'],
 ['192.168.0.12', '(443/tcp)|'],
 ['192.168.0.9', '(3389/tcp)|'],
 ['192.168.0.15', '(443/tcp)|'],
 ['192.168.0.16', '(443/tcp)|'],
 ['192.168.0.3', '(3389/tcp)|'],
 ['192.168.0.14', '(443/tcp)|']]

>>> sorted([i.split() for i in a],key=lambda e: (map(int,e[0].split('.')),int(e[1].strip('(').split('/')[0])))
[['192.168.0.3', '(443/tcp)|'],
 ['192.168.0.3', '(3389/tcp)|'],
 ['192.168.0.9', '(3389/tcp)|'],
 ['192.168.0.12', '(443/tcp)|'],
 ['192.168.0.14', '(443/tcp)|'],
 ['192.168.0.15', '(443/tcp)|'],
 ['192.168.0.15', '(8443/tcp)|'],
 ['192.168.0.16', '(443/tcp)|'],
 ['192.168.0.16', '(8443/tcp)|'],
 ['192.168.0.40', '(443/tcp)|'],
 ['192.168.0.176', '(443/tcp)|']]

相关问题 更多 >