2012-06-13 26 views
8

Tôi đang tìm một giải pháp thanh lịch hơn để định dạng địa chỉ MAC với dấu hai chấm. Tôi đang sử dụng Python 3.2. Một danh sách ưa thích có thể hiểu được?Định dạng thanh lịch cho địa chỉ MAC bằng Python 3.2

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

http://stackoverflow.com/questions/4959741/python-print-mac-address-out-of-6-byte-string –

+0

@EricFortis, ví dụ đó là khác nhau, trong đó địa chỉ MAC nằm trong chuỗi nhị phân. Câu hỏi này có chuỗi ascii là điểm bắt đầu – TJD

+0

@Eric: hơi khác, tôi thấy câu hỏi và câu trả lời này nhưng nó không trả lời câu hỏi cụ thể này – jftuga

Trả lời

12

Mã của bạn có thể dễ dàng chuyển đổi sang một hình thức hiểu:

':'.join(h[i:i+2] for i in range(0,12,2)) 
+2

+1 Tôi thích nó tốt hơn giải pháp của tôi :) – Levon

1

Không chắc cách khá đây là, nhưng nó sẽ làm những gì bạn hỏi:

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

cho:

'00:23:3a:99:0c:21' 
+1

Tại sao bạn sử dụng liệt kê? –

+1

Đó là những gì tôi mặc dù sử dụng. Nó * làm * làm những gì OP hỏi, do đó, là một câu trả lời * hợp lệ *. – Levon

0

Giải pháp đơn giản nhất ở đây là chỉ để sử dụng str.join()

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

Đây sử dụng một phiên bản sửa đổi của grouper() recipe từ itertools tài liệu:

def str_grouper(n, iterable): 
    args = [iter(iterable)] * n 
    for part in zip(*args): #itertools.izip in 2.x for efficiency. 
     yield "".join(part) 
0

Vâng, tôi có thể bắt đầu với một cái gì đó khá đặc biệt, kể từ khi bạn biết rằng đó là địa chỉ MAC bạn biết chính xác kích thước và định dạng.

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]) 

Nhưng chúng ta có thể làm điều này tốt hơn nếu chúng ta tạo một lớp và sau đó cho biết cách định dạng chuỗi của nó.

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 
+2

Đây là một chút tiết, và cũng có thể, định dạng chuỗi kiểu mới ('str.format()' trên '%') được ưu tiên cho mã mới. –

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' 

Điều đó chiến thắng cho mật độ cao nhất của dấu ngoặc đơn?

+1

Có bạn đã thắng! – jamylak

1

Đây không phải là giải pháp ngắn nhất, nhưng nó chấp nhận tất cả các loại định dạng mac phổ biến làm đầu vào. Nó cũng thực hiện một số kiểm tra xác nhận.

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 

Dưới đây là danh sách các chuỗi địa chỉ mac và liệu họ sẽ được coi là hợp lệ hay không hợp lệ:

'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 

Tất cả những giá trị sẽ được trả lại theo hình thức kinh điển như:

'00:80:41:ae:fd:7e' 
Các vấn đề liên quan