解析和重新排列主机名

2024-10-02 10:19:14 发布

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

下面是存储在文本文件中的主机名列表。在

web1.maxi.com
web3.maxi.com
web4.maxi.com
web5.maxi.com
web6.maxi.com
web7.maxi.com
web8.maxi.com
web9.maxi.com
web11.maxi.com

为了快速显示它,需要将其解析并重写/显示为

^{pr2}$

你们能帮我吗?任何建议都会有帮助的。在


Tags: com列表主机名web3文本文件pr2web1maxi
3条回答
with open("data.txt") as f:
    sites=[x.strip() for x in f]
    ranges=[]
    for x in sites:
        x=x.split(".")
        num=int(x[0][x[0].index("web")+3:])
        if ranges:
            if num-ranges[-1][-1]==1:
                ranges[-1].append(num)
            else:
                ranges.append([num])    
        else:
            ranges.append([num])        
    print ranges
    print "web["+",".join(str(x[0]) if len(x)==1 else str(x[0])+"-"+str(x[-1]) for x in ranges)+"].maxi.com"

输出:

^{pr2}$

我的看法是:

#print hosts
lines = open("log.txt").readlines()
numbers = [int(line.split(".")[0][3:]) for line in lines]
out = [[]]
index = 0
for i in xrange(len(numbers) - 1):
    out[index].append(numbers[i])
    if (numbers[i + 1] - numbers[i] != 1):
        out.append( [] )
        index += 1
out[-1].append(numbers[-1])
strings = [str(number[0]) if len(number) == 1 else str(number[0]) + "-" + str(number[-1]) for number in out]
print ",".join(strings)

最好把循环改成更具Python式/功能性的。在

使用perl,您可以使用^{}模块来压缩数字序列。在

下面的解决方案可以处理混合和无序的站点列表。在

填充

web3.maxi.com
web4.maxi.com
web5.maxi.com
mail1.mexi.com
web6.maxi.com
web9.maxi.com
web9.maxi.com

web11.maxi.com
mail3.mexi.com
web7.maxi.com
mail4.mexi.com
mail25.mexi.com      
  mail26.mexi.com
mail27.mexi.com
mail28.mexi.com
  web8.maxi.com
mail29.mexi.com
mail110.mexi.com
web1.maxi.com

解析.pl

^{pr2}$

这样运行:

perl parse.pl < infile

输出:

web[1,3-9,11].maxi.com
mail[1,3-4,25-29,110].mexi.com

可能是神秘的@numbers = $nums =~ /$pre(\d+)$post/g扩展为与正则表达式匹配的项数组,并将其保存在@numbers中。在

请注意,此解决方案将整个文件加载到内存中。在

相关问题 更多 >

    热门问题