11

MAC アドレスをコロンでフォーマットするためのより洗練されたソリューションを探しています。Python 3.2 を使用しています。おそらく派手なリスト内包表記ですか?

s=""
h="00233a990c21"
for i in range(0,12,2):
    s += h[i:i+2] + ":"
s=s[:-1]
print("s=",s)
4

8 に答える 8

19

コードは簡単に内包形式に変換されます。

':'.join(h[i:i+2] for i in range(0,12,2))
于 2012-06-13T00:39:26.113 に答える
6

これは最短の解決策ではありませんが、すべての一般的なタイプの Mac フォーマットを入力として受け入れます。また、いくつかの検証チェックも行います。

import re

def format_mac(mac: str) -> str:
    mac = re.sub('[.:-]', '', mac).lower()  # remove delimiters and convert to lower case
    mac = ''.join(mac.split())  # remove whitespaces
    assert len(mac) == 12  # length should be now exactly 12 (eg. 008041aefd7e)
    assert mac.isalnum()  # should only contain letters and numbers
    # convert mac in canonical form (eg. 00:80:41:ae:fd:7e)
    mac = ":".join(["%s" % (mac[i:i+2]) for i in range(0, 12, 2)])
    return mac

MAC アドレス文字列のリストと、それらが有効または無効と見なされるかどうかを次に示します。

'008041aefd7e',  # valid
'00:80:41:ae:fd:7e',  # valid
'00:80:41:AE:FD:7E',  # valid
'00:80:41:aE:Fd:7E',  # valid
'00-80-41-ae-fd-7e',  # valid
'0080.41ae.fd7e',  # valid
'00 : 80 : 41 : ae : fd : 7e',  # valid
'  00:80:41:ae:fd:7e  ',  # valid
'00:80:41:ae:fd:7e\n\t',  # valid

'aa:00:80:41:ae:fd:7e',  # invalid
'0:80:41:ae:fd:7e',  # invalid
'ae:fd:7e',  # invalid
'$$:80:41:ae:fd:7e',  # invalid

すべての有効なものは、次のように正規の形式で返されます。

'00:80:41:ae:fd:7e'
于 2015-04-04T11:55:32.427 に答える
1

これがどれほどきれいかはわかりませんが、あなたが求めることを行います:

':'.join([h[i:i+2] for i,j in enumerate(h) if not (i%2)])

与えます:

'00:23:3a:99:0c:21'
于 2012-06-13T00:36:51.150 に答える
0
>>> import itertools
>>> h = '00233a990c21'
>>> ':'.join(a+b for a, b in (itertools.izip(
...                              itertools.compress(h, itertools.cycle((1,0))),
...                              itertools.compress(h, itertools.cycle((0,1))))))
>>> '00:23:3a:99:0c:21'

それは括弧の密度が最も高い場合に勝ちますか?

于 2012-06-13T01:09:29.247 に答える
0

ここでの最も簡単な解決策は、使用することですstr.join()

>>> ":".join(str_grouper(2, "00233a990c21"))
'00:23:3a:99:0c:21'

ここでは、ドキュメントのgrouper()レシピの修正版を使用しています。itertools

def str_grouper(n, iterable):
     args = [iter(iterable)] * n
     for part in zip(*args): #itertools.izip in 2.x for efficiency.
         yield "".join(part)
于 2012-06-13T00:39:18.277 に答える
0

正確なサイズと形式を知っている MAC アドレスであることを知っているので、かなり具体的なものから始めるかもしれません。

print "%s:%s:%s:%s:%s:%s" % (h[0:2], h[2:4], h[4:6], h[6:8], h[8:10], h[10:12])

しかし、クラスを作成し、文字列をフォーマットする方法を教えれば、これを改善できます。

class Mac():
    def __init__(self, mac):
        self.mac = mac
    def __str__(self):
        return "%s:%s:%s:%s:%s:%s" % (
            self.mac[0:2],
            self.mac[2:4],
            self.mac[4:6],
            self.mac[6:8],
            self.mac[8:10],
            self.mac[10:12])

m = Mac("123456789012")
print m
于 2012-06-13T00:44:30.873 に答える