2017-01-02 167 views
-1

我想从一些示例文本返回一个MAC地址列表。 re.search返回第一个结果,在这种情况下我想要所有结果,但我只能得到一个结果。当我使用re.findall时,它将返回每个MAC地址的最后一个字符,而不是完整的地址。re.findall没有返回正确的结果

任何想法?

例如:

>>> test = """ 
...   Mac Address Table 
... ------------------------------------------- 
... 
... Vlan Mac Address  Type  Ports 
... ---- -----------  -------- ----- 
... 66 0800.0e54.9df0 STATIC  Gi2/0/27 
... 100 5046.5a08.5a60 STATIC  Gi2/0/27 
... Total Mac Addresses for this criterion: 2 
... """ 
macs = re.search(r"([0-9A-Fa-f]){4}\.([0-9A-Fa-f]){4}\.([0-9A-Fa-f]){4}",test) 
>>> print macs.group() 
0800.0f54.99f0 
macs = re.findall(r"([0-9A-Fa-f]){4}\.([0-9A-Fa-f]){4}\.([0-9A-Fa-f]){4}",test) 
[('0', '4', '0'), ('6', '8', '0')] 
+2

删除所有捕获组。 'macs = re.findall(r“[0-9A-Fa-f] {4} \。[0-9A-Fa-f] {4} \。[0-9A-Fa-f] {4}” ,测试)' –

+0

谢谢!你想补充说,所以我可以接受? – AlexW

回答

0

作为每re.findall文档:

如果一个或多个基团存在于该图案,返回组的列表;如果模式有多个组,这将是一个元组列表。空结果包含在结果中,除非他们触及另一场比赛的开始。

所以,把所有捕捉群体纳入非捕获或者如果可能的话将其删除(在这里,它是最好删除他们,因为他们仅仅是多余的):

macs = re.findall(r"[0-9A-Fa-f]{4}\.[0-9A-Fa-f]{4}\.[0-9A-Fa-f]{4}"‌​,test) 
+0

这不是解决问题的好方法,因为它不会解决问题,也不会解决问题,只是绕过它。 – Arount

+0

@Arount:看:*我试图返回一个MAC地址列表* - 这正是这个解决方案所做的。 –

+0

你说得对,对不起,我的不好。但是python文档的一部分以及你推荐的内容给了我们印象。findall不支持捕获组是错误的。我不能删除我的downvote,如果你编辑你的awser我可能。 – Arount

0

其他awnsers建议删除捕获组,但这不是你想要的,这不是如何解决问题。

re.findall(图案,字符串标志= 0)

返回所有非重叠在字符串模式的匹配,作为字符串列表。字符串从左到右扫描,匹配按照找到的顺序返回。如果模式中存在一个或多个组,请返回组列表;如果模式有多个组,这将是一个元组列表。空结果包含在结果中,除非他们触及另一场比赛的开始。

真正的问题是捕获组都错了,我过去的良好格局,然后再用来方便地检查之间的差异会之一:

([0-9A-Fa-f]{4})\.([0-9A-Fa-f]{4})\.([0-9A-Fa-f]{4}) # good one 
([0-9A-Fa-f]){4}\.([0-9A-Fa-f]){4}\.([0-9A-Fa-f]){4} # bad one 

正如你可以看到,如果你捕获所有的字母数字由4个字符(([CHARS]{4})而不是([CHARS]){4}组成的字符串可以捕获所有的字符串部分在一组,所以re.findall将捕获的字符组,不仅人物一个接一个。

因为你是一个和012捕获的人物之一返回不重叠匹配您获得此结果。

结果具有良好的模式:

[('0800', '0e54', '9df0'), ('5046', '5a08', '5a60')] 
+0

OP不需要包含十六进制字符块的元组列表,只有*一个MAC地址列表*。 –