验证用户输入的MAC地址的最佳方法是什么?
格式为HH:HH:HH:HH:HH:HH,其中每个H都是十六进制字符。
例如,00:29:15:80:4E:4A有效,而00:29:804E4A无效。
发布于 2011-10-03 06:36:39
如果您只是指语法,那么这个regexp应该适用于您
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只检查字符串的开头,因此不需要开头的^。
发布于 2013-08-08 06:21:37
我讨厌那些强迫用户像电脑一样思考的程序。
通过接受任何有效的格式使它变得更加友好。
去掉分隔符,不管它是什么,然后得到剩下的十六进制值。这样,如果用户输入破折号或空格,它也可以正常工作。
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")发布于 2013-08-08 05:56:55
如果您希望确保始终存在'-‘或':’,但不是两者都有,则可以在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 Truehttps://stackoverflow.com/questions/7629643
复制相似问题