2014-09-26 7 views
1

Я долгое время читатель, в первый раз спрашивающий (пожалуйста, будьте осторожны).Разметка пробела, за исключением внутренних фигурных скобок в файле журнала - Python

Я делаю это с довольно грязным WHILE READ в Unix Bash, но я изучаю python и хотел бы попытаться сделать более эффективную процедуру парсера.

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

(я предполагаю, что библиотека RE необходимо это сделать)

т.е. ввод образца:

[21/Sep/2014:13:51:12 +0000] serverx 192.0.0.1 identity 200 8.8.8.8 - 500 unavailable RESULT 546 888 GET http ://www.google.com/something/fsd?=somegibberish&youscanseethereisalotofcharactershere+bananashavealotofpotassium [somestuff/1.0 (OSX v. 1.0; this_is_a_semicolon; colon:93.1.1) Somethingelse/1999 (COMMA, yep_they_didnt leave_me_a_lot_to_make_this_easy) DoesanyonerememberAOL/1.0] 

Желаемый результат:

'21/Sep/2014:13:51:12 +0000'; 'serverx'; '192.0.0.1'; 'identity'; '200'; '8.8.8.8'; '-'; '500'; 'unavailable'; 'RESULT'; '546'; '888'; 'GET'; 'htp://www.google.com/something/fsd?=somegibberish&youscanseethereisalotofcharactershere+bananashavealotofpotassium'; 'somestuff/1.0 (OSX v. 1.0; this_is_a_semicolon; rev:93.1.1) Somethingelse/1999 (COMMA, yep_they_didnt leave_me_a_lot_to_make_this_easy DoesanyonerememberAOL/1.0' 

Если вы заметите, что первый и последние поля (те, что были в квадратных скобках) по-прежнему имеют неповрежденные пространства.

Бонусные баллы 14-поле (URL) всегда находится в одном из следующих форматов:

  • HTP: //google.com/path-data-might-be-here-and- может-содержать-специальные символы-

  • google.com/path-data-might-be-here-and-can-contain-special-characters

  • xyz.abc.www.google.com/ путь-данные могут-быть здесь и может содержать-специальный-Ч racters

  • google.com:443

  • google.com

Я хотел бы добавить дополнительный столбец данных, который включает в себя только домен (т.е. xyz.abc.www.google.com или google.com).

До сих пор я принимал разобранный вывод с использованием Unix AWK с инструкцией IF, чтобы разделить это поле на «/» и проверить, не пустое ли третье поле. Если это так, верните первое поле (до тех пор, пока: если оно присутствует), в противном случае верните третье поле). Если есть лучший способ сделать это - желательно в той же процедуре, что и выше, я хотел бы услышать - так что мой окончательный вывод может быть:

'21/Sep/2014:13:51:12 +0000'; 'serverx'; '192.0.0.1'; 'identity'; '200'; '8.8.8.8'; '-'; '500'; 'unavailable'; 'RESULT'; '546'; '888'; 'GET'; 'htp://www.google.com/something/fsd?=somegibberish&youscanseethereisalotofcharactershere+bananashavealotofpotassium'; 'somestuff/1.0 (OSX v. 1.0; this_is_a_semicolon; rev:93.1.1) Somethingelse/1999 (COMMA, yep_they_didnt leave_me_a_lot_to_make_this_easy DoesanyonerememberAOL/1.0'; **'www.google.com'** 

Сноска: Я изменил НТТР HTP в образец, поэтому он не создавал бы кучу отвлекающих ссылок.

ответ

1

Шаблон регулярного выражения \[[^\]]*\]|\S+ будет токенизировать ваши данные, хотя он не снимает скобки из значений нескольких слов. Вам нужно сделать это в отдельной стадии:

import re 

def parse_line(line): 
    values = re.findall(r'\[[^\]]*\]|\S+', line) 
    values = [v.strip("[]") for v in values] 
    return values 

Вот более подробная версия шаблона регулярного выражения:

pattern = r"""(?x) # turn on verbose mode (ignores whitespace and comments) 
    \[  # match a literal open bracket '[' 
    [^\]]* # match zero or more characters, as long as they are not ']' 
    \]  # match a literal close bracket ']' 
     |  # alternation, match either the section above or the section below 
    \S+  # match one or more non-space characters 
    """ 

values = re.findall(pattern, line) # findall returns a list with all matches it finds 
+0

Да это он. Можете ли вы пройти через часть поиска '' \ [[^ \]] * \] | \ S + ''?Я довольно новичок в регулярном выражении, но стараюсь учиться. –

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

  • Нет связанных вопросов^_^