如何从python正则表达式中排除特定的字符串
我试图解析/etc/mtab
,但排除/boot
。我认为也许没有捕获的团体会走,但它并不像我预期的那样工作。这是我构建的正则表达式:如何从python正则表达式中排除特定的字符串
proc = subprocess.Popen(["ssh", server, "cat", mtab],stdout = subprocess.PIPE)
for line in proc.stdout:
fsMatch = re.search(r'([\w/:]+) (/([\w/:-]+)|(?:boot)) (nfs|ext3)', line)
if fsMatch:
print fsMatch.group(1,2,4)
输出:
('/dev/sda1', '/boot', 'ext3')
('/dev/mapper/foo1', '/export/foo1', 'ext3')
('/dev/mapper/foo2', '/export/foo2', 'ext3')
('/dev/mapper/foo3', '/export/foo3', 'ext3')
('/dev/mapper/foo4', '/export/foo4', 'ext3')
('/dev/mapper/foo5', '/export/foo5', 'ext3')
('servernfs:/install', '/mnt', 'nfs')
我很有信心的|
是错误的(显然更多的是错的),但已经打了一个路障。
我正在寻找所有比赛为/[\w/:-]+
,但不包括火柴/boot
建议?
只排除该行:
for line in proc.stdout:
if 'boot' not in line:
# the rest
然而,由于mtab
是空间分隔的,你可以用split
:
>>> with open('foo.txt') as f:
... lines = [line.split(' ') for line in f if 'boot' not in line]
...
这个检查会更有意义,如果fsMatch行不行吗?例如:'if fsMatch and not fsMatch.group(2).startswith('/ boot')'? – 2013-04-04 06:07:06
是的,启动是关键。但是,你有'fs:/ boot'匹配问题。 – hobs 2013-04-04 06:26:45
像/ home/user/bin/reboot这样的路径会被''boot'not in line'过滤器拒绝,我想。而'/ boot'不能修复它或者没有startswith位。我喜欢Jon Clements的方法。让正则表达式完成一场比赛的繁重工作,然后开始进行简单精确的排除。 – hobs 2013-04-04 06:32:00
您需要使用负回顾后或负先行,描述here以下提示:
r'^(?!/boot).*$'
如果你需要捕获'servernfs:'一个而不是'servernfs:/ boot',你需要在一个'|'和'([a-z] + :)'顶部的某处(在^之后)
正则表达式不擅长排除事物。做一个单独的检查。 – Barmar 2013-04-04 06:01:54