正则表达式匹配 MAC 个地址(不同的分隔符、格式等)

Regex match MAC Addresses (different delimiters, formatting, etc.)

我试图找到一个 Python 兼容的 Regex 表达式,最适合匹配 MAC 地址,但排除可能被误认为它们的内容(例如、SSH 密钥)。另外,我想匹配不同的分隔符(例如-:.)、不同的格式(例如、*nix、Windows、Cisco)和一个字符串(例如, 无分隔符).

此外,我正在尝试找到可能满足我要求的最短答案(,正则表达式)。


以下是一些有助于缩小可能性的示例数据:

必须匹配 MAC 地址(即排除额外的特殊字符):

(13:14:5f:cD:42:5f)
#13-14-5f-cD-42-5f
13.14.5f.cD.42.5f/
1314:5fcD:425f#
"1314.5fcD.425f"
1314-5fcD-425f
13145fcD425f
#13145fcD425f:

不得与以下任何一项匹配:

56:32:13:14:5f:cD:42:5f:65
56-32-13-14-5f-cD-42-5f-65
56.32.13.14.5f.cD.42.5f.65
13:14:5f:cD:42:5f:
:13:14:5f:cD:42:5f
111113:14:5f:cD:42:5ffff
ff13:14:5f:cD:42:5f
1314-5fcD.425f
1314-5f.cD:425f
13:14.5f:cD:42-5f
45fcD4
fcD4
13145fcD425f13145fcD425f
aa13145fcD425f13145fcD425fff

这是我最终想到的。我将尝试在下面标题为注释的部分中概述详细信息。我故意留在三个 redundant/unnecessary non-capturing 组,但这有助于为三个路径中的每一个划分代码。

非常感谢您的反馈。谢谢。


\b(?:(?<![-:\.])(?:(?:[0-9A-Fa-f]{2}(?=([-:\.]))(?:[0-9A-Fa-f]{2}){5})|(?:[0-9A-Fa-f]{4}(?=([-:\.]))(?:[0-9A-Fa-f]{4}){2}))(?![-:\.])|(?:[0-9A-Fa-f]{12}))\b

Debuggex Demo

备注:

  • 我写的正则表达式 strict-ly 匹配分隔符,这意味着 MAC 地址中的分隔符必须是通过反向引用在整个匹配中相同(例如、hh:hh:hh:hh:hh:hh、NOT hh-hh:hh.hh:hh-hh & NOT hh:hh:hh:hh:hh-hh)
  • 分隔符分组在方括号[]中,表示里面的任何项目都可以匹配
  • 贯穿始终的三个主要分隔符分别是 [-:\.] dash/hyphen、冒号和 period/dot。
  • 我转义了 \.(点),因为它的含义不明确(例如. 可以表示 任何字符,这不是我想要的)。
  • 我的群组中除了两个都是 non-capturing 群组,因此它们以 (?: 开头并以匹配的 ).
  • 结尾
  • |(管道)代表OR,导致分支
  • \b(单词边界)防止在字符串中间找到匹配项(例如,第 7-8、19-20 行)
  • 路径:1
    • (?<![-:\.]) & (?![-:\.])(负后向和负前向)防止在 SSH 密钥中找到的匹配项(虽然这里可能只需要冒号,但不能说我见过其他两个用于键的分隔符)
    • 路径:1.1 *nix/Windows 匹配格式:分隔的十六进制字符对(例如,hh:hh:hh:hh:hh:hh )
      • [0-9A-Fa-f]{2} 十六进制字符重复两次
      • (?=([-:\.])) lookahead & capture (inner parens) the delimiter (capturing group </code>)</li> <li><code> 匹配存储在捕获组 </code> 中的第一个定界符,<code>(?:[0-9A-Fa-f]{2}){5} 再重复定界符和十六进制对模式五次
    • Path:1.2 Cisco 匹配格式:quad hex chars delimited (e.g., hhhh.hhhh.hh嗯)
      • [0-9A-Fa-f]{4} 十六进制字符重复四次
      • (?=([-:\.])) lookahead & capture (inner parens) the delimiter (capturing group </code>)</li> <li><code> 匹配存储在捕获组 </code> 中的第二个分隔符,<code>(?:[0-9A-Fa-f]{4}){2} 再重复分隔符和四个十六进制字符模式两次
  • Path:2字符串匹配格式:所有12个十六进制字符,non-delimited(例如,hhhhhhhhhhhh)
    • [0-9A-Fa-f]{12} 十六进制字符重复十二次
    • 不要求字符串前后没有分隔符,因为 none 在其中使用,并且能够匹配示例第 9 行和第 16 行(但仍遵循单词边界)

为了满足 OP 要求的最短答案,我从上面的答案中删除了 non-capturing 组(,使它们全部捕获组)和额外的分组为了清楚起见,我得到 140 个字符:

\b((?<![-:\.])([0-9A-Fa-f]{2}(?=([-:\.]))([0-9A-Fa-f]{2}){5}|[0-9A-Fa-f]{4}(?=([-:\.]))([0-9A-Fa-f]{4}){2})(?![-:\.])|[0-9A-Fa-f]{12})\b

这是我用于验证的示例:

56:32:13:14:5f:cD:42:5f:65
(13:14:5f:cD:42:5f)
#13-14-5f-cD-42-5f
56-32-13-14-5f-cD-42-5f-65
13.14.5f.cD.42.5f/
56.32.13.14.5f.cD.42.5f.65
111113:14:5f:cD:42:5ffff
ff13:14:5f:cD:42:5f
1314:5fcD:425f#
1314.5fcD.425f)
1314-5fcD-425f
1314-5fcD.425f
1314-5f.cD:425f
13:14.5f:cD:42-5f
13145fcD425f
#13145fcD425f:
45fcD4
fcD4
13145fcD425f13145fcD425f
aa13145fcD425f13145fcD425fff