正则表达式,用于匹配MAC地址或“ NA”

时间:2019-05-20 19:24:47

标签: regex python-3.x regex-lookarounds regex-group regex-greedy

我有一个正则表达式可以正确匹配我正在处理的数据子集。当我针对完整的数据集运行它时,它开始失败。我注意到一些价值 取决于列,“ NA”与MAC地址还是AP名称。

样本数据:

00:0b:85:57:bc:c0     00:0b:85:57:bc:c1     AP1130         10.10.163.217     Joined
00:1c:0f:81:db:80     00:1c:63:23:ac:a0     AP1140         10.10.163.216     Joined
00:1c:0f:81:fc:20     00:1b:d5:9f:7d:b2     AP1            10.10.163.215     Joined
00:1c:0f:81:fc:20     N A                   N A            10.10.163.215     Not joined
00:21:1b:ea:36:60     00:0c:d4:8a:6b:c1     AP2            10.10.163.214     Joined

正则表达式:

((?:(?:[0-9a-f]{2}[:-]){5})(?:[0-9a-f]{2}))(?:\s+?)(((?:(?:[0-9a-f]{2}[:-]){5})(?:[0-9a-f]{2}))|(N A))(?:\s+)((AP.+?)|(N A))(?:\s)

我修改了我的正则表达式,但是它仍然与MAC地址或“ NA”不匹配。 名称字段相同:匹配AP名称或“ NA”

我的现状:https://regex101.com/r/sgGEzh/1

我认为方括号不正确,但是看不到我的(|)OR运算符出现故障的地方。我现在正在复制某些组。

我应该匹配第一个MAC地址,第二个MAC地址字符串'NA',最后一个AP名称​​或字符串'NA'。

我应该每行总是得到三个匹配的组。

直到我尝试处理'NA'字符串之前。

2 个答案:

答案 0 :(得分:1)

这是我对您的输入数据和要求的看法:

([a-f0-9]{2}(?::[a-f0-9]{2}){5})\s+((?:[a-f0-9]{2}(?::[a-f0-9]{2}){5})|N A)\s+(N A|\S+)

另请参阅https://regex101.com/r/sgGEzh/2

答案 1 :(得分:1)

您要匹配正确的东西,只需要摆脱N AAP.+?周围不需要的捕获组即可。这些导致这些字符串最终以不同的组形式出现在结果中。您只需要3个捕获组。

您还有许多其他确实不需要的组,例如\s+?周围的非捕获组。如果每个|替代项已经在组中,则不需要它们。您唯一需要的非捕获组就是量化后的[0-9a-f]{2}[:-]周围的那个组。

以下内容可以工作并删除所有冗余组:

((?:[0-9a-f]{2}[:-]){5}[0-9a-f]{2})\s+?((?:[0-9a-f]{2}[:-]){5}[0-9a-f]{2}|N A)\s+(AP.+?|N A)\s

DEMO