Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Python re.match包含可选组,该组为None_Regex_Python 3.x - Fatal编程技术网

Regex Python re.match包含可选组,该组为None

Regex Python re.match包含可选组,该组为None,regex,python-3.x,Regex,Python 3.x,我试图在for-line循环中使用re.compile。在re.compile之后,在行上运行re.match。使用Regex101,我可以在组上获得正确的匹配,但在python内部运行时,对于具有空字符串的组,它将返回None。我所追求的是匹配组,即使它们是空的 要匹配的字符串: Interface Status Protocol Description BE1 up up Mg0/RSP0/

我试图在for-line循环中使用re.compile。在re.compile之后,在行上运行re.match。使用Regex101,我可以在组上获得正确的匹配,但在python内部运行时,对于具有空字符串的组,它将返回None。我所追求的是匹配组,即使它们是空的

要匹配的字符串:

Interface          Status      Protocol    Description
BE1                up          up          
Mg0/RSP0/CPU0/0    up          up          NNI to Cat2960x G1/0/1
Te0/0/0/3          admin-down  admin-down  
Gi0/0/1/0          down        down        Test L2VPN
RP/0/RSP0/CPU0:LAB-9001-1#
最后一个组(描述)应该是可选的,可以包含描述,也可以为空。这在Regex101中起作用,我在这个过滤器上有4个组:

^\s*(?:(?P<interface>[a-zA-Z0-9]\S+?))\s+(?:(?P<status>[up|admin\-down]\S+?))\s+(?:(?P<protocol>[up|admin\-down]\S+))\s+(?:(?P<description>(?<!^).*))
^\s*(?:(?P[a-zA-Z0-9]\s+)\s+(?:(?P[up | admin \-down]\s+)\s+(?:(?P[up | admin \-down]\s+)))s+(?:(?P(?)?
在我使用compile and match的代码中,如果描述为空,则返回None,当我希望它返回前3个组,并为第4个组返回一个空字符串(描述)

用于结果中的行。拆分行():
line=line.rstrip()

p1=重新编译(r'^\s*(?:(?P[a-zA-Z0-9]\s+)\s+(?:(?P[up | admin \-down]\s+)\s+(?:(?P[up | admin \-down]\s+))(?P(?

您使用的正则表达式包含字符类,而不是分组结构(

[up | down]
不匹配
向上
向下
,它匹配
u
p
|
d
o
w
n
),最后一个图案部分必须匹配一个强制空格+任何字符,但您的
rstrip
行必须匹配,并且没有剩余的空格

固定正则表达式看起来像

^(?P<interface>[a-zA-Z0-9]\S*)\s+(?P<status>up|admin-down)\s+(?P<protocol>up|admin-down)(?:\s+(?P<description>.*))?


注意:如果您使用
re.match
^
字符串锚点的开头是不必要的。感谢您提供演示链接和解释。现在rstrip就有意义了。
^(?P<interface>[a-zA-Z0-9]\S*)\s+(?P<status>up|admin-down)\s+(?P<protocol>up|admin-down)(?:\s+(?P<description>.*))?
import re
result = r"""Interface          Status      Protocol    Description
BE1                up          up          
Mg0/RSP0/CPU0/0    up          up          NNI to Cat2960x G1/0/1
Te0/0/0/3          admin-down  admin-down  
Gi0/0/1/0          down        down        Test L2VPN
RP/0/RSP0/CPU0:LAB-9001-1#"""
p1 = re.compile(r'(?P<interface>[a-zA-Z0-9]\S*)\s+(?P<status>up|admin-down)\s+(?P<protocol>up|admin-down)(?:\s+(?P<description>.*))?')

for line in result.splitlines():
    line = line.rstrip()
    m = p1.match(line)
    if m:
        print(m.groups())