2013-04-04 168 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] + :)'頂部的某處(在^之後)

相關問題