如何验证MAC地址格式?
怎样才能验证用户输入的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
只会从字符串的开头开始检查,因此开头不需要加^
。