gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:48:32 25 4
gpt4 key购买 nike

我试图找到一个最适合匹配 MAC 地址的 Python 兼容正则表达式,但排除可能被误认为是它们的内容(例如,SSH key )。另外,我想匹配不同的分隔符(例如,-:.),不同的格式(例如、*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

最佳答案

这就是我最终想到的。我将尝试在下面标题为“注释”的部分中概述详细信息。我故意留下了三个冗余/不必要的非捕获组,但这有助于界定三个路径中每一个路径的代码。

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

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

Regular expression visualization

Debuggex Demo

注释:

  • 我将正则表达式编写为严格-ly匹配分隔符,这意味着 MAC 地址中的分隔符必须在整个匹配过程中通过反向引用保持相同(例如,hh:hh:hh:hh:hh:hh,不是 hh-hh:hh.hh:hh-hh 且不是 hh:hh:hh:hh:hh-hh)
  • 分隔符分组在方括号 [] 中并表示里面的任何项目都可以匹配
  • 整个过程中使用的三个主要分隔符是 [-:\.]分别是破折号/连字符、冒号和句点/点。
  • 我逃脱了 \. (点),因为它的含义不明确(例如,. 可以表示任何字符,这不是我想要的)。
  • 除了两个组之外,所有组都是非捕获组,因此它们以 (?: 开头并以匹配的 ) 结尾.
  • | (管道) 代表 OR,导致分支
  • \b (字边界)防止在字符串中间找到匹配项(例如,第 7-8 行、第 19-20 行)
  • 路径:1
    • (?<![-:\.]) & (?![-:\.]) (负向后查找和负向前查找)防止在 SSH key 中找到匹配(尽管这里可能只需要冒号,但不能说我已经看到用于 key 的其他两个分隔符)
    • 路径:1.1 *nix/Windows 匹配格式:分隔的十六进制字符对(例如、hh:hh:hh:hh:hh:hh)
      • [0-9A-Fa-f]{2}十六进制字符重复两次
      • (?=([-:\.]))前瞻并捕获(内括号)分隔符(捕获组 \1 )
      • \1匹配捕获组 \1 中存储的第一个分隔符, (?:\1[0-9A-Fa-f]{2}){5}重复分隔符和十六进制对模式五次
    • 路径:1.2 Cisco 匹配格式:四十六进制字符分隔(例如、hhhh.hhhh.hhhh)
      • [0-9A-Fa-f]{4}十六进制字符重复四次
      • (?=([-:\.]))前瞻并捕获(内括号)分隔符(捕获组 \2 )
      • \2匹配捕获组 \2 中存储的第二个分隔符, (?:\2[0-9A-Fa-f]{4}){2}重复分隔符和四个十六进制字符模式两次
  • Path:2 字符串匹配格式:所有 12 个十六进制字符,非分隔(例如,hhhhhhhhhhhh)
    • [0-9A-Fa-f]{12}十六进制字符重复十二次
    • 不需要字符串前后没有分隔符,因为内部没有使用任何分隔符,并且能够匹配示例第 9 行和第 16 行(但仍遵循单词边界)

为了满足OP要求的尽可能短的答案,我从上面的答案中删除了非捕获组(,使它们全部捕获组)和额外的分组清晰,我得到140个字符:

\b((?<![-:\.])([0-9A-Fa-f]{2}(?=([-:\.]))(\3[0-9A-Fa-f]{2}){5}|[0-9A-Fa-f]{4}(?=([-:\.]))(\5[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

关于python - 正则表达式匹配 MAC 地址(不同的分隔符、格式等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28908601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com