オレオレIPアドレス範囲表記のパース
ツールとかを作っているとIPアドレスの範囲を指定して書きたいことがたまにあります。
例えば192.168.1.10 - 192.168.1.20の範囲の生きているPCをpingで調べたいときなど。
このIP範囲を表すとき、192.168.1.[10-20]なんて指定したいわけです。
こんな表記の文字列をパースして192.168.1.10から192.168.1.20までの10個のIPを生成する時のpythonコードを書いてみました。
なかなかうまくかけてるんじゃないかと思ったので公開してみます。
# -*- coding: utf-8 -*- if __name__ == '__main__': import sys import re import itertools pattern = re.compile('\[(\d+)\-(\d+)\]') args = sys.argv[1:] def _iprange(range_str): """ [start-end]表記を展開して返すジェネレータ。 役割的にはrange(start, end+1)みたいなもの。 """ match = pattern.match(range_str) if match is not None: start, end = sorted(map(int, match.groups())) for i in range(start, end + 1): yield str(i) else: yield range_str for ip_pattern in args: # 各IPのセグメント単位に_iprangeを適用して展開してそれの積を取る(展開) for ip in itertools.product(*map(_iprange, ip_pattern.split('.'))): print '.'.join(ip)
itertools便利ですよね。