2015-07-21 46 views
0

的最後一次出現我有數據,看起來像這樣:熊貓DF和RE - 找到一個匹配Y.然後找到X

/media/info/DRIVE/Animal/Stuff 
    Rights: _RWCEMF_  User/Group .CN=Dog.OU=Random.OU=Place.O=X.T=X. 
    Rights: _RWCEMF_  User/Group .CN=Cat.OU=Random.OU=Place.O=X.T=X. 
    /media/info/DRIVE/Tricks/Treats 
    Rights: _RWCEMF_  User/Group .CN=Gorilla.OU=Random.OU=Place.O=X.T=X. 
    Rights: _RWCEMF_  User/Group .CN=Hippo.OU=Random.OU=Place.O=X.T=X. 
    Rights: _R______  User/Group .CN=Dog.OU=Random.OU=Place.O=X.T=X. 
    /media/info/DRIVE/Private/Hideout 
    Rights: _RWCEMF_  User/Group .CN=Hippo.OU=Random.OU=Place.O=X.T=X. 

說這正好爲千行,我希望看到所有Dog擁有的權限。理想情況下,輸出看起來像這樣:

/DRIVE/Animal/Stuff Rights: _RWCEMF_ 
    /DRIVE/Tricks/Treats Rights: _R______ 

問題:這是我應該用正則表達式來解決嗎?我一直在進行一些閱讀/試用,看起來你找不到,然後回顧最近發生的/media/info/DRIVE,因爲回溯會檢查靜態字符數量。

另一方面,lookahead找到第一個匹配,然後繼續尋找第二個匹配 - 即使這是幾百行後來在一個完全獨立的驅動器。

關於如何解決這個問題的任何想法?我正在用這個旋轉我的輪子。所有搜索都指向正則表達式。

回答

1

在這裏你去:

import pandas as pd 

data = [] 
for line in open('temp.text'): 
    if line.startswith('/media/'): 
     path = line[:-1] 
    else: 
     rights = line.split()[1] 
     owner = re.match('.*.CN=([^.]+).*', line).groups()[0] 
     row = {'path': path, 'right': rights, 'owner': owner} 
     data.append(row) 
df = pd.DataFrame(data) 
df[df.owner=='Dog'] 
+0

這是輝煌。我是這麼想的 - 實際上這樣更好,因爲我可以繼續引用df來獲取其他用戶的權限,而無需再次通過整個過程。 – Corey

0

你可以獲取使用此正則表達式得到的字符串的前8個字符:

_.*Dog 

這會給你一切與狗的權限啓動字符串。

或者,如果_是不是一個先決條件,你可以看看以這種方式獲得的串的子串(2-9):

:.*Dog