「IPアドレスのIPv4を判定せよ!」という実装を考えた場合について考えました。
IPv4は理論上、0.0.0.0 ~ 255.255.255.255 の範囲で割り当てられます。
実質的には使用されない組み合わせが存在するようですが、今回は理論上の範囲を全て網羅するように実装しました。
まず、上記の実装を考えた時に、私はスプリットして、「.」をカウントして数値が範囲内であるか判定・・・
みたいな考え方でやってしまいました。
この超面倒な実装でも解決はできたのですが、もっと上手く書けないものか?と考えてみました。
あまりにもスマートさに欠けたコードだったもので。
私の検索の仕方が悪いのか?ググってもコレ!っといったIPv4のアドレス判定の実装例が見つかりませんでした。
もっとも、IPv4を判定する事に需要がないだけなのかも知れませんが。
色々と方法はあると思いますが、最終的に行き着いたのは正規表現を用いる実装です。
自分なりに調べた結果、たぶん、まず最初に正規表現を使った実装を考える人の方が多いでしょう。。
今回の実装について、おそらくもっと美しく整えられるであろうと思いつつも、そのまま実装した、ちょっと悪い例です。
import re # 標準入力で "255.255.255.255" s = input() x = re.fullmatch(r"([2][0-5][0-5]|[1][\d][\d]|[\d][\d]|[\d])" r"\.([2][0-5][0-5]|[1][\d][\d]|[\d][\d]|[\d])" r"\.([2][0-5][0-5]|[1][\d][\d]|[\d][\d]|[\d])" r"\.([2][0-5][0-5]|[1][\d][\d]|[\d][\d]|[\d])", s) # 0.0.0.0 ~ 255.255.255.255 の範囲内であれば True # 範囲外であれば Falseを返す if x is None: print(False) else: print(True)
正規表現を使いこなせれば、文字列の操作や処理が非常に楽になります。
ごちゃごちゃとした汚いコードになる事を防ぐだけでなく、処理も軽くなるはずです。
もっと、色々なパターンで実装していきたいと思います。