首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何验证MAC地址的格式?

如何验证MAC地址的格式?
EN

Stack Overflow用户
提问于 2011-10-03 06:26:13
回答 11查看 39.9K关注 0票数 20

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

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

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

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2011-10-03 06:36:39

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

代码语言:javascript
复制
import re
...
if re.match("[0-9a-f]{2}([-:]?)[0-9a-f]{2}(\\1[0-9a-f]{2}){4}$", x.lower()):
    ...

它接受12位十六进制数字,使用:-或nothing作为对之间的分隔符(但分隔符必须是一致的……或者所有分隔符都是:,或者都是-,或者没有分隔符)。

以下是解释:

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

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

票数 60
EN

Stack Overflow用户

发布于 2013-08-08 06:21:37

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

通过接受任何有效的格式使它变得更加友好。

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

代码语言:javascript
复制
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")
票数 3
EN

Stack Overflow用户

发布于 2013-08-08 05:56:55

如果您希望确保始终存在'-‘或':’,但不是两者都有,则可以在Python中使用以下命令:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7629643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档