在python

时间:2015-08-03 15:47:17

标签: python regex string grouping

我使用正则表达式来隔离从文件中获取的行中的特定关键字。 我想搜索整个文件并返回具有相同关键字的行组。

我对此感到有点困惑,我想知道在Python中是否有直接的正则表达式方法吗?

e.g。 - >

我的文件可能如下所示

1  0001    1   UG  science,ee;YEAR=onefour;standard->2;district->9
2  0002    1   UG  science,cs;YEAR=onefive;standard->1;district->9
3  0012    2   UG  science,eng;YEAR=onefour;standard->3;district->4
4  0021    2   UG  science,ee;YEAR=onetwo;standard->2;district->9
5  0056    4   UG  science,cs;YEAR=onefive;standard->1;district->8
6  0145    3   UG  science,eng;YEAR=onetwo;standard->4;district->2

我用正则表达式提取

"YEAR=****" 

并希望根据

的值对行进行分组
"****"

输出应该如下所示 -

1  0001    1   UG  science,ee;YEAR=onefour;standard->2;district->9
3  0012    2   UG  science,eng;YEAR=onefour;standard->3;district->4

2  0002    1   UG  science,cs;YEAR=onefive;standard->1;district->9
5  0056    4   UG  science,cs;YEAR=onefive;standard->1;district->8

4  0021    2   UG  science,ee;YEAR=onetwo;standard->2;district->9
6  0145    3   UG  science,eng;YEAR=onetwo;standard->4;district->2

我相信我可以用很长的方式打开文件,存储在词典和匹配等等。但是想知道是否有简洁的方法来做到这一点。

按要求 - 我尝试编写和运行的一些代码 -

#!/usr/bin/python

import re

##open file and read each line of file

dfile = open("datafile.txt","r")

##regex to find YEAR in entry and return YEAR

regex_unique = re.compile(r'(?<=\bYEAR=)[^;]+')

list_Name =[]

for line in dfile:
    match1 = re.search(regex_unique,line)
    if match1:
        if match1.group(0) not in list_Name:
        list_Name.append(match1.group(0))


## print (list_Name)

for item in list_Name:
for line in dfile:
    match2 = re.search(item,line)
    if match2:
        print (match2)

最后一点似乎不起作用 - 我假设我给了

item

re.search

它应该在整个文件中搜索该单词 - 现在我想我可能需要在实际单词之前和之后添加一些通配符条目才能使其正常工作。

1 个答案:

答案 0 :(得分:1)

我认为我说正则表达式只处理线上的匹配,而不是如何聚合匹配 - 所以你需要自己做。您可以通过编写自己的实用程序函数并将其与应用程序代码分开来保持简单。

分组操作一般必须通过所有项目来组装组。如果没有通过所有数据来收集组,你的问题就无法解决,然后另一个传递输出组。

列表字典是通过键收集每一行的自然数据结构(如您所知)。自己设置这个有点笨拙,因为你经常需要测试是否存在一个密钥来知道你是应该添加到现有列表还是创建一个新列表。幸运的是,python提供了defaultdict,它可以让你:

from collections import defaultdict
>>> d = defaultdict(list)
>>> d[key].append(line)

因此,您可以执行以下操作:

def groupLinesByMatch(filename,regex):
    import re
    from collections import defaultdict

    regex = re.compile(regex)
    result = defaultdict(list)

    for line in open(filename).readlines():
        matches = regex.match(line)
        if matches:    
            result[matches.group(1)].append( line )

    return result.values()


for lines in groupLinesByMatch(filename, regex):
    for line in lines:
        print line,
    print