如何验证MAC地址的格式?

2024-05-19 02:51:35 发布

您现在位置:Python中文网/ 问答频道 /正文

验证用户输入的MAC地址的最佳方法是什么?

格式是HH:HH:HH:HH:HH:HH,其中每个H都是十六进制字符。

例如,00:29:15:80:4E:4A有效,而00:29:804E4A无效。


Tags: 方法用户mac地址格式hh字符
3条回答

如果要确保始终存在“-”或“:”,而不是两者都存在,可以在Python中使用以下命令:

import re

def is_valid_macaddr802(value):
    allowed = re.compile(r"""
                         (
                             ^([0-9A-F]{2}[-]){5}([0-9A-F]{2})$
                            |^([0-9A-F]{2}[:]){5}([0-9A-F]{2})$
                         )
                         """,
                         re.VERBOSE|re.IGNORECASE)

    if allowed.match(value) is None:
        return False
    else:
        return True

如果您只是指语法,那么这个regexp应该适合您

import re
...
if re.match("[0-9a-f]{2}([-:]?)[0-9a-f]{2}(\\1[0-9a-f]{2}){4}$", x.lower()):
    ...

它接受12个十六进制数字,其中:-或无作为成对之间的分隔符(但分隔符必须是一致的。。。要么所有的分隔符都是:,要么都是-,要么没有分隔符)。

这就是解释:

  • [0-9a-f]表示十六进制数字
  • {2}意味着我们想要两个
  • [-:]?表示破折号或冒号,但可选。注意,破折号asfirst字符不表示范围,而只表示本身。此子表达式括在括号中,以便以后可以将其重新用作反向引用。
  • [0-9a-f]{2}是另一对十六进制数字
  • \\1这意味着我们希望匹配之前作为分隔符匹配的相同表达式。这就是保证一致性的原因。注意,regexp语法是\1,但我使用的是一个常规字符串,因此反斜杠必须通过加倍来转义。
  • [0-9a-f]{2}另一对十六进制数字
  • {4}前一个带圆括号的块必须精确地重复4次,总共给出6对数字:<pair> [<sep>] <pair> ( <same-sep> <pair> ) * 4
  • $字符串必须在它们之后结束

请注意,在Python中,re.match只检查从字符串开头开始的部分,因此不需要在开头使用^

我讨厌那些强迫用户像电脑一样思考的程序。

接受任何有效的格式,使其更友好。

去掉分隔符,不管它是什么,然后得到剩余的十六进制值。这样,如果用户输入破折号或空格,它也可以工作。

import string
allchars = "".join(chr(a) for a in range(256))
delchars = set(allchars) - set(string.hexdigits)

def checkMAC(s):
  mac = s.translate("".join(allchars),"".join(delchars))
  if len(mac) != 12:
      raise ValueError, "Ethernet MACs are always 12 hex characters, you entered %s" % mac 
  return mac.upper()


checkMAC("AA:BB:CC:DD:EE:FF")
checkMAC("00-11-22-33-44-66")
checkMAC("1 2 3 4 5 6 7 8 9 a b c")
checkMAC("This is not a mac")

相关问题 更多 >

    热门问题