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")
如果要确保始终存在“-”或“:”,而不是两者都存在,可以在Python中使用以下命令:
如果您只是指语法,那么这个regexp应该适合您
它接受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
只检查从字符串开头开始的部分,因此不需要在开头使用^
。我讨厌那些强迫用户像电脑一样思考的程序。
接受任何有效的格式,使其更友好。
去掉分隔符,不管它是什么,然后得到剩余的十六进制值。这样,如果用户输入破折号或空格,它也可以工作。
相关问题 更多 >
编程相关推荐