Pandas DF和RE - 找到一个匹配的Y.然后找到X的最后一次出现

时间:2015-07-21 15:04:29

标签: python regex pandas dataframe

我的数据如下:

    /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 ,因为lookback检查静态字符数量。

另一方面,lookahead找到第一场比赛,然后继续寻找第二场比赛 - 即使后来在一个完全独立的车道中有数百行。

有关如何处理此问题的任何想法?我用这个旋转我的车轮。所有搜索都指向正则表达式。

2 个答案:

答案 0 :(得分: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']

答案 1 :(得分:0)

您可以获取使用此正则表达式获得的字符串的前8个字符:

_.*Dog

这将为您提供以Dog的权限开头的所有字符串。

或者如果_不是前置条件,你可以查找以这种方式获得的字符串的子串(2-9):

:.*Dog