2012-06-13 9 views
8

Estoy buscando una solución más elegante para formatear una dirección MAC con dos puntos. Estoy usando Python 3.2. ¿Una lista de fantasía tal vez?Formato elegante para una dirección MAC en 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, ese ejemplo es diferente, donde la dirección MAC está en una cadena binaria. Esta pregunta tiene una cadena ascii como punto de partida – TJD

+0

@Eric: ligeramente diferente, vi esta pregunta y respuesta pero no respondió a esta pregunta específica – jftuga

Respuesta

12

Su código se convierte fácilmente en una forma de comprensión:

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

+1 Me gusta más que mi solución :) – Levon

1

No está seguro de lo bonito que es esto, pero va a hacer lo que pides:

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

da:

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

¿Por qué usa enumerar? –

+1

Es lo que pensé en usar. * Hace * lo que pide el OP, por lo que es una respuesta * válida *. – Levon

0

La solución más fácil aquí es sólo para usar str.join()

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

Aquí usando una versión modificada de la receta grouper() de los itertools docs:

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

Bueno, puede comenzar con algo muy específico, ya que usted sabe que es una dirección MAC, conoce el tamaño y el formato exactos.

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

Pero podemos mejorar esto si creamos una clase y luego le decimos cómo formatearla.

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

Esto es un poco prolijo, y también, el nuevo formato de cadena de estilo ('str.format()' sobre '%') es preferido para el nuevo código. –

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' 

¿Eso victoria para la mayor densidad de paréntesis?

+1

¡Sí, has ganado! – jamylak

1

Esta no es la solución más corta, pero acepta todos los tipos de formatos mac como entradas. También realiza algunas verificaciones de validació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 

Aquí es una lista de cadenas de direcciones MAC y si van a ser considerados como válidos o no válidos:

'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 

Todos los válidos serán devueltos en forma canónica como:

'00:80:41:ae:fd:7e' 
Cuestiones relacionadas