如何验证MAC地址格式?

23 投票
12 回答
48791 浏览
提问于 2025-04-17 03:33

怎样才能验证用户输入的MAC地址是否正确呢?

MAC地址的格式是 HH:HH:HH:HH:HH:HH,其中每个 H 都是一个十六进制字符。

比如说, 00:29:15:80:4E:4A 是一个有效的地址,而 00:29:804E4A 就是不正确的。

12 个回答

1

如果你想确保字符串中要么有'-',要么有':',但不能同时出现这两者,你可以在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
3

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

让程序更友好一点,接受任何有效的格式。

去掉分隔符,不管是什么,然后获取剩下的十六进制值。这样,如果用户输入了破折号或空格,也能正常工作。

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")
66

如果你只是想了解语法,那么这个正则表达式应该能满足你的需求。

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}表示我们需要两个这样的数字。
  • [-:]?表示可以有一个短横线或冒号,但这个是可选的。注意,短横线作为第一个字符并不是表示范围,而是仅仅表示它自己。这个部分用括号括起来,方便后面重复使用。
  • [0-9a-f]{2}是另一对十六进制数字。
  • \\1表示我们想要匹配之前作为分隔符的相同表达式。这就是确保分隔符一致性的地方。注意,正则表达式的语法是\1,但我这里用的是普通字符串,所以反斜杠需要用两个来表示。
  • [0-9a-f]{2}又是一对十六进制数字。
  • {4}表示前面用括号括起来的部分必须重复4次,总共会有6对数字:<pair> [<sep>] <pair> ( <same-sep> <pair> ) * 4
  • $表示字符串必须在这些数字后面结束。

注意,在Python中,re.match只会从字符串的开头开始检查,因此开头不需要加^

撰写回答