使用findall()和search()的奇怪正则表达式问题

时间:2018-06-24 07:21:21

标签: python regex python-2.7 search findall

我正在尝试使用 \ w {2} \ d / \ d {1,2}(/ \ d {1,2})?来匹配以下两个界面在Cisco交换机上:

Gi1 / 0/1

Fa0 / 1

  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” 作为输出。

  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']

3 个答案:

答案 0 :(得分:1)

来自findall文档

  

如果模式中存在一个或多个组,则返回一个列表   组;如果模式有多个,则这将是一个元组列表   组。

在正则表达式中,您有一个捕获组(/\d{1,2})?

您可以将其设为非捕获组,而不是(?:/\d{1,2})?

您的正则表达式如下:

\w{2}\d/\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

Demo

答案 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']