2015-08-03 1 views
0

Я использовал regex для выделения определенного ключевого слова в строке, взятой из файла. Я хочу искать весь файл и возвращать группы строк, которые имеют одно и то же ключевое слово.Линии поиска и возврата в файле с соответствующим ключевым словом в python

Я немного смущен этим, и мне было интересно, существует ли способ прямого регулярного выражения для этого в Python?

например. ->

Мой файл может выглядеть следующим образом

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=****" 

и хотите, чтобы сгруппировать строки по значению

"****" 

The выход должен выглядеть следующим образом:

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 

он должен искать это слово во всем файле - теперь, я думаю, мне, возможно, придется добавить подстановочный знак entrie до и после фактического слова, чтобы заставить его работать.

+0

Это может помочь: _https: //regex101.com/r/rI3nD4/2_ –

+0

Звуки как три элемента: (1) регулярное выражение; (2) строка соответствия экстентов регулярных выражений; (3) путем сопоставления строки. У вас (1) выполнено; вы застряли на (2)? Можете ли вы разместить небольшой код? –

ответ

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 
+1

мои мысли точно, хотя я пытаюсь просто создать список общих значений в первом проходе файла, а затем перебрать по списку и группировать строки в соответствии с каждой записью в списке. – Sid5427

Смежные вопросы