我正在尝试使用 \ w {2} \ d / \ d {1,2}(/ \ d {1,2})?来匹配以下两个界面在Cisco交换机上:
Gi1 / 0/1
Fa0 / 1
当我使用re.search()时,它将返回所需的输出。
import re
port = "Gi1/0/1 Fa0/1"
search = re.search(r'\w{2}\d/\d{1,2}(/\d{1,2})?', port)
print search.group()
我得到“ Gi1 / 0/1” 作为输出。
当我使用re.findall()
import re
port = "Gi1/0/1 Fa0/1"
search = re.findall(r'\w{2}\d/\d{1,2}(/\d{1,2})?', port)
print search
我得到了不想要的“ ['/ 1','']” 。
为什么findall()不返回 ['Gi1 / 0/1','Fa0 / 1'] ?
是因为我使用了(/ \ d {1,2})?,而findall()应该返回这部分吗?这是为什么?
我们如何使用findall()获得 ['Gi1 / 0/1','Fa0 / 1'] ?
答案 0 :(得分:1)
来自findall文档
如果模式中存在一个或多个组,则返回一个列表 组;如果模式有多个,则这将是一个元组列表 组。
在正则表达式中,您有一个捕获组(/\d{1,2})?
您可以将其设为非捕获组,而不是(?:/\d{1,2})?
您的正则表达式如下:
import re
port = "Gi1/0/1 Fa0/1"
search = re.findall(r'\w{2}\d/\d{1,2}(?:/\d{1,2})?', port)
print search
答案 1 :(得分:0)
search.group()
返回由正则表达式\w{2}\d/\d{1,2}(/\d{1,2})?
找到的全部匹配项。它不考虑捕获组。它等效于search.group(0)
。使用search.group(1)
时,它将返回/1
:第一个捕获组的结果。
另一方面,re.findall
返回所有匹配组的结果。为了获得预期的结果,您的正则表达式应为
(\w{2}\d/(?:\d{1,2}/)?\d{1,2})
Python代码
>>> re.findall(r'(\w{2}\d/(?:\d{1,2}/)?\d{1,2})', port)
['Gi1/0/1', 'Fa0/1']
正则表达式细分
( #Start Capturing group
\w{2}\d/ #Match two characters in [A-Za-z0-9_] followed by a digit and slash
(?:\d{1,2}/)? #Followed by two digits which are optional
\d{1,2} #Followed by two digits
) #End capturing group
PS 。根据您的问题,我认为您仅匹配字母。在这种情况下,请使用[A-Za-z]
代替\w
答案 2 :(得分:0)
如果要使用正则表达式;这将起作用:
search = re.findall(r'\w{2}\d/\d{1}(?:/\d{1})?', port)
您也可以这样做:
>>> "Gi1/0/1 Fa0/1".split(' ')
['Gi1/0/1', 'Fa0/1']