Python 如何从捕获中排除部分备选方案?

Python 如何从捕获中排除部分备选方案?,python,regex,python-2.7,pcre,regular-language,Python,Regex,Python 2.7,Pcre,Regular Language,有一个正则表达式:((?:description | speed | type | peers)\s+set | classify)。 如何从捕获组中排除\s+set 必须只有说明或速度或类型或对等方或分类 我们可以这样做: pattern = '^\s+"([A-Za-z]+)\.([_A-Za-z0-9-]+)"\s+"([^\s]+)"\s+((description|speed|type|peers)\s+set|classify)\s+"?(.+)"?' p = re.compile(

有一个正则表达式:
((?:description | speed | type | peers)\s+set | classify)
。 如何从捕获组中排除
\s+set

必须只有
说明
速度
类型
对等方
分类

我们可以这样做:

pattern = '^\s+"([A-Za-z]+)\.([_A-Za-z0-9-]+)"\s+"([^\s]+)"\s+((description|speed|type|peers)\s+set|classify)\s+"?(.+)"?'
p = re.compile(pattern)
path = 'some_file'
fd = open(path)
for l in fd.readlines():
    m = p.search(l)
    if not m:
        continue
    g = m.groups()
    if g[4]:
        (region, host, interface, cmd, value) = g[0].lower(), g[1].lower(), g[2].lower(), g[4], g[5]
    else:
        (region, host, interface, cmd, value) = g[0].lower(), g[1].lower(), g[2].lower(), g[3], g[5]
但它是丑陋的

if g[4]:
    (region, host, interface, cmd, value) = g[0].lower(), g[1].lower(), g[2].lower(), g[4], g[5]
else:
    (region, host, interface, cmd, value) = g[0].lower(), g[1].lower(), g[2].lower(), g[3], g[5]
如何在正则表达式引擎中剪切
\s+设置
,并且代码中只有一行:

(区域、主机、接口、cmd、值)=g[0]。lower(),g[1]。lower(),g[2]。lower(),g[3],g[4]

如果您不介意多个捕获组(因此稍微修改代码的其余部分),这非常简单-只需执行与您所做相反的操作即可

(?:(描述|速度|类型|对等方)\s+set |(分类))
,如中所示

如果你不想要它,你可以使用环顾四周<代码>(?:描述|速度|类型|对等点)(?=\s+set)|分类)
,如中所示


regex中没有“排除这件事”,因为其他工具(如非捕获组和lookarounds)可以为您做到这一点。

您尝试过使用lookarounds吗?您好。我试过使用“^\s+”([A-Za-z]+)\([\U A-Za-z0-9-]+)“\s+”([^\s]+)“\s+((描述|速度|类型|对等体)(?=\s+set)|分类)\s+”?(.+)“?”但“set”属于最后一组……我建议您使用类似的方法来帮助您开发表达式。你也可以考虑在一个大的步骤中少做些事情。