2015-07-21 43 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