代码之家  ›  专栏  ›  技术社区  ›  Anderson

对不同格式的IP地址进行排序

  •  1
  • Anderson  · 技术社区  · 6 年前

    我想得到:

    ['192.168.70.19 (tcp/1433)']
    ['192.168.70.223 (tcp/1051),192.168.70.19 (tcp/1025), 192.168.70.245 (tcp/1051)'] 
    ['192.168.70.19 (tcp/3389),192.168.70.223 (tcp/3389)']
    

    ['192.168.70.19 (tcp/1433)']
    ['192.168.70.19 (tcp/1025),192.168.70.223 (tcp/1051), 192.168.70.245 (tcp/1051)'] 
    ['192.168.70.19 (tcp/3389),192.168.70.223 (tcp/3389)']
    

    这是我的密码,不对。我有麻烦排序的IP地址,因为希望保留tcp部分。有没有人对此有更好的建议或解决方案。如有任何意见,我们将不胜感激。

    import re
    a=['192.168.70.19 (tcp/1433)', '192.168.70.223 (tcp/1051),192.168.70.19 (tcp/1025),192.168.70.245 (tcp/1025)', '192.168.70.19 (tcp/3389),192.168.70.223 (tcp/3389)']
    
    
    for z in a:
        if z.find(','):
            #removes tcp part (but I want to keep)        
            #b = re.sub(r'\(.*?\)', '', z)
    
            #I can sort the IP with this, but it doesnt have the tcp part.
            #z.sort(key=lambda s: map(int, s.split('(')[0].split('.')))
    
    2 回复  |  直到 6 年前
        1
  •  -1
  •   blhsing    6 年前

    您可以使用以下列表:

    [','.join(sorted(i.split(','), key=lambda s: tuple(map(int, s.split()[0].split('.'))))) for i in a]
    

    因此,使用以下输入(注意,我已经更改了 192.168.70.19 在您的示例输入中 192.168.70.39 要演示IP地址是按数字排序的,请执行以下操作:

    a=['192.168.70.19 (tcp/1433)',
       '192.168.70.223 (tcp/1051),192.168.70.39 (tcp/1025),192.168.70.245 (tcp/1025)',
       '192.168.70.19 (tcp/3389),192.168.70.223 (tcp/3389)']
    

    以上列表将返回:

    ['192.168.70.19 (tcp/1433)',
     '192.168.70.39 (tcp/1025),192.168.70.223 (tcp/1051),192.168.70.245 (tcp/1025)', 
     '192.168.70.19 (tcp/3389),192.168.70.223 (tcp/3389)']`
    
        2
  •  -1
  •   mayurmadnani    6 年前

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

    要对IP+TCP组合进行排序,请使用该元组的第一部分按IP地址进行排序

    输出:

    ['192.168.70.19 (tcp/1433)', 
    '192.168.70.19 (tcp/1025),192.168.70.223 (tcp/1051),192.168.70.245 (tcp/1025)', 
    '192.168.70.19 (tcp/3389),192.168.70.223 (tcp/3389)']