2013-04-04 166 views
2

我试图解析/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

建议?

+3

正则表达式不擅长排除事物。做一个单独的检查。 – Barmar 2013-04-04 06:01:54

回答

1

只排除该行:

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] 
... 
+1

这个检查会更有意义,如果fsMatch行不行吗?例如:'if fsMatch and not fsMatch.group(2).startswith('/ boot')'? – 2013-04-04 06:07:06

+0

是的,启动是关键。但是,你有'fs:/ boot'匹配问题。 – hobs 2013-04-04 06:26:45

+0

像/ home/user/bin/reboot这样的路径会被''boot'not in line'过滤器拒绝,我想。而'/ boot'不能修复它或者没有startswith位。我喜欢Jon Clements的方法。让正则表达式完成一场比赛的繁重工作,然后开始进行简单精确的排除。 – hobs 2013-04-04 06:32:00

2

您需要使用负回顾后或负先行,描述here以下提示:

r'^(?!/boot).*$' 

如果你需要捕获'servernfs:'一个而不是'servernfs:/ boot',你需要在一个'|'和'([a-z] + :)'顶部的某处(在^之后)

相关问题