下面是存儲在文本文件中的主機名列表。解析並重新排列主機名稱
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
顯示它的緣故不久它需要被解析並改寫/顯示
web[1,3-9,11].maxi.com
你們可以幫助我在此,有什麼建議會有所幫助。
下面是存儲在文本文件中的主機名列表。解析並重新排列主機名稱
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
顯示它的緣故不久它需要被解析並改寫/顯示
web[1,3-9,11].maxi.com
你們可以幫助我在此,有什麼建議會有所幫助。
使用perl,您可以使用Set::IntSpan
模塊來壓縮數字序列。
下面的解決方案可以處理混合和無序的網站列表。
INFILE
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
#!/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;
}
運行這樣的:
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
中。
請注意,此解決方案將整個文件加載到內存中。
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"
輸出:
[[1], [3, 4, 5, 6, 7, 8, 9], [11]]
web[1,3-9,11].maxi.com
我對此採取:
#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 /功能。