【发布时间】:2015-06-25 19:19:39
【问题描述】:
有一个正则表达式:((?: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]
?
【问题讨论】:
-
您是否尝试过使用环视?
-
嗨。我尝试使用 ^\s+"([A-Za-z]+)\.([_A-Za-z0-9-]+)"\s+"([^\s]+)"\s+((说明|speed|type|peers)(?=\s+set)|classify)\s+"?(.+)"?'
-
但 'set' 属于最后一组...
-
我建议你使用类似regex101.com/#python 的东西来帮助你发展你的表达方式。您也可以考虑在一大步中尝试少做一些事情。
标签: python regex python-2.7 pcre regular-language