如何从捕获中排除部分替代方案?
How to exclude part of alternative from capture?
有一个正则表达式:((?:description|speed|type|peers)\s+set|classify)
。
如何从捕获组中排除 \s+set
?
必须只有description
或speed
或type
或peers
或classify
。
我们可以这样做:
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
并且只有一行代码:
(region, host, interface, cmd, value) = g[0].lower(), g[1].lower(), g[2].lower(), g[3], g[4]
?
如果您不介意多个捕获组(因此稍微更改其余代码),这非常简单 - 只需执行与您正在做的相反的事情。
(?:(description|speed|type|peers)\s+set|(classify))
如 https://regex101.com/r/bR1nV7/1
所示
如果你不想要它,你可以使用 lookarounds。 ((?:description|speed|type|peers)(?=\s+set)|classify)
如 https://regex101.com/r/bR1nV7/2
所示
正则表达式中没有 "exclude this thing",因为非捕获组和环视等其他工具会为您完成。
有一个正则表达式:((?:description|speed|type|peers)\s+set|classify)
。
如何从捕获组中排除 \s+set
?
必须只有description
或speed
或type
或peers
或classify
。
我们可以这样做:
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
并且只有一行代码:
(region, host, interface, cmd, value) = g[0].lower(), g[1].lower(), g[2].lower(), g[3], g[4]
?
如果您不介意多个捕获组(因此稍微更改其余代码),这非常简单 - 只需执行与您正在做的相反的事情。
(?:(description|speed|type|peers)\s+set|(classify))
如 https://regex101.com/r/bR1nV7/1
如果你不想要它,你可以使用 lookarounds。 ((?:description|speed|type|peers)(?=\s+set)|classify)
如 https://regex101.com/r/bR1nV7/2
正则表达式中没有 "exclude this thing",因为非捕获组和环视等其他工具会为您完成。