If you mean just the syntax then this regexp should work for you
import re
...
if re.match("[0-9a-f]{2}([-:]?)[0-9a-f]{2}(\1[0-9a-f]{2}){4}$", x.lower()):
...
it accepts 12 hex digits with either :
or -
or nothing as separators between pairs (but the separator must be uniform... either all separators are :
or are all -
or there is no separator).
This is the explanation:
[0-9a-f]
means an hexadecimal digit
{2}
means that we want two of them
[-:]?
means either a dash or a colon but optional. Note that the dash as first char doesn't mean a range but only means itself. This subexpression is enclosed in parenthesis so it can be reused later as a back reference.
[0-9a-f]{2}
is another pair of hexadecimal digits
\1
this means that we want to match the same expression that we matched before as separator. This is what guarantees uniformity. Note that the regexp syntax is 1
but I'm using a regular string so backslash must be escaped by doubling it.
[0-9a-f]{2}
another pair of hex digits
{4}
the previous parenthesized block must be repeated exactly 4 times, giving a total of 6 pairs of digits: <pair> [<sep>] <pair> ( <same-sep> <pair> ) * 4
$
The string must end right after them
Note that in Python re.match
only checks starting at the start of the string and therefore a ^
at the beginning is not needed.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…