首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析和重新排列主机名

解析和重新排列主机名
EN

Stack Overflow用户
提问于 2012-09-19 11:51:31
回答 3查看 186关注 0票数 8

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

代码语言:javascript
复制
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

为了在短时间内显示它,需要对其进行解析并重写/显示为

代码语言:javascript
复制
web[1,3-9,11].maxi.com

你们能在这方面帮我吗,任何建议都会很有帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-19 18:23:58

对于perl,您可以使用Set::IntSpan模块来压缩数字序列。

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

infile

代码语言:javascript
复制
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

parse.pl

代码语言:javascript
复制
#!/usr/bin/perl -l

use Set::IntSpan;
use File::Slurp qw/slurp/;

$str = slurp(\*STDIN);

# Remove redundant whitespace
chop $str;
$str =~ s/^[\t ]+|[\t ]+$//gm;
$str =~ s/\R+/\n/g;

# Copy $str so we can match numbers in it without disturbing the loop
$nums = $str;

# Parse lines in $str in sequence
while($str =~ /^(.*)$/gm) {
  $line = $1;

  # Extract bits before and after number
  ($pre, $post) = $line =~ /([^\d]+)\d+(.*)$/m;

  # Check if its been printed already
  next if $seen{$pre . $post};

  # If not, extract numbers
  @numbers = $nums =~ /$pre(\d+)$post/g;

  print $pre . "[" 
        . Set::IntSpan->new(@numbers)->run_list()
        . "]" . $post;

  $seen{$pre . $post} = 1;
}

像这样运行它:

代码语言:javascript
复制
perl parse.pl < infile

输出:

代码语言:javascript
复制
web[1,3-9,11].maxi.com
mail[1,3-4,25-29,110].mexi.com

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

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

票数 3
EN

Stack Overflow用户

发布于 2012-09-19 12:07:51

代码语言:javascript
复制
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"

输出:

代码语言:javascript
复制
[[1], [3, 4, 5, 6, 7, 8, 9], [11]]
web[1,3-9,11].maxi.com
票数 3
EN

Stack Overflow用户

发布于 2012-09-19 13:36:14

我对此的看法:

代码语言:javascript
复制
#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)

最好将循环更改为更具pythonic/功能性的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12488289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档