如何从捕获中排除部分替代方案?

时间:2015-06-25 19:19:39

标签: python regex python-2.7 pcre regular-language

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

必须只有descriptionspeedtypepeersclassify

我们可以这样做:

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+set witihin正则表达式引擎并且代码中只有一行:

(region, host, interface, cmd, value) = g[0].lower(), g[1].lower(), g[2].lower(), g[3], g[4]

1 个答案:

答案 0 :(得分:0)

如果您不介意多个捕获组(因此稍微改变其余的代码),那么它非常容易 - 只需与您正在做的相反。

https://regex101.com/r/bR1nV7/1

中显示的

(?:(description|speed|type|peers)\s+set|(classify))

如果您不想要,可以使用外观。 ((?:description|speed|type|peers)(?=\s+set)|classify)

中显示的{ language: "eng", isReliable: "true", confidence: "0.9979894639898946" }

没有"排除这个东西"在正则表达式中,因为非捕获组和外观等其他工具可以为您完成。

相关问题