Python で IPv4 のサブネットマスク文字列の判定をしたい


### 目的

dot(`.`)で区切られたIPv4のサブネットマスク文字列がサブネットマスクとして有効であることを判定したい。

### 判定例

[code]

    '255.128.0.0'->'1111 1111 1000 0000 0000 0000 0000 0000' :OK
    '255.64.0.0.'->'1111 1111 0100 0000 0000 0000 0000 0000' :NG
    
[/code]

### 質問内容

下記ソースコードで機能的に満足しますが、もっとエレガントな記述方法があると思うので、ご教示をお願いしたいです。

ソースコード

[code]

    import re
    
    
    def chk(subnetmask):
        chk_string = re.compile(
            r"[0-9]{1,3}[.]{1}[0-9]{1,3}[.]{1}[0-9]{1,3}[.]{1}[0-9]{1,3}", re.A)
    
        if chk_string.fullmatch(subnetmask):
            mask_octet = subnetmask.split(".")
            mask_octet = list((map(int, mask_octet)))
    
            mask = 0
            for i, n in enumerate(mask_octet):
                mask += n*2**(8*(3-i))
    
            # 2進数文字列変換 接頭文字は削除
            bmask = bin(mask)
            bmask = bmask.lstrip("0b")
    
            # 32bit 先頭bit=1なら文字列長8bitx4oct=32のはず。
            if len(bmask) == 8*4:
                # 文字1のカウント
                count1 = bmask.count('1')
                # 32bitの1ではないはずの桁数部分を削除するために除算
                # いわゆるビットシフト
                lmask = bin(int(mask/(2**(8*4-count1))))
                lmask = lmask.lstrip("0b")
                c1 = lmask.count('1')
                # 前詰めなら同数になるはず
                if count1 == c1:
                    return True
        return False
    
[/code]



[code]

    import ipaddress
    
    def chk(subnetmask):
        try:
            ipaddress.IPv4Network((0, subnetmask))
            return True
        except ipaddress.NetmaskValueError:
            return False
    
    if __name__ == '__main__':
        print(chk('255.128.0.0'))
        print(chk('255.64.0.0'))
    
    #
    True
    False
    
[/code]



[code]

    import ipaddress
    
    def chk(subnetmask):
        try:
            ipaddress.IPv4Network((0, subnetmask))
            return True
        except ipaddress.NetmaskValueError:
            return False
    
    if __name__ == '__main__':
        print(chk('255.128.0.0'))
        print(chk('255.64.0.0'))
    
    #
    True
    False
    
[/code]

