2015-12-05 3 views
0

Мне нужно исправить несколько записей в нескольких строках, в настоящее время использующих perl, но мне нужно переместить функциональность на python.python fix многострочные записи журнала

Пример записи многоканальная линия:

2015-12-02T17:56:13.783276Z our-elb-prod 52.20.50.51:60944  10.30.0.32:80 0.000024 0.063357 0.000066 200 200 0 12164 "GET  http://www.example.com:80/episodes/2014/10/ HTTP/1.0" "IgnitionOneBot/Nutch-1.9 (
This is the IgnitionOne Company Bot for Web Crawling. 
IgnitionOne Company Site: http://www.example.com/ 
    ; 
rong2 dot huang at ignitionone dot com 
)" - - 

Текущий скрипт на Perl, чтобы исправить это является:

while (my $row = <$fh>) { 
chomp $row; 
    if ($row =~ /^(\d{4})-(\d\d)-(\d\d)T(\d)/) { 
    print "\n" if $. != 1; 
} 
print $row; 

который выводит скорректированный одну запись строки:

2015-12-02T17:56:13.783276Z telepictures-elb-prod 52.20.50.51:60944 10.30.0.32:80 0.000024 0.063357 0.000066 200 200 0 12164 "GET http://www.example.com:80/episodes/2014/10/ HTTP/1.0" "IgnitionOneBot/Nutch-1.9 ( This is the IgnitionOne Company Bot for Web Crawling. IgnitionOne Company Site: http://www.example.com/ ; rong2 dot huang at ignitionone dot com )" - - 

Таким образом, в двух словах мы в основном ищем любые строки, которые не начинаются с регулярного выражения даты, если они совпадают, мы добавляем t подойдите к первой строке без \ n.

Я видел другие способы достижения этого с помощью awk и т. Д., Но для этого нужно быть чистым питоном. Я посмотрел на Python. Join specific lines on 1 line, похоже, что itertools может быть предпочтительным способом?

ответ

1

Вы можете достичь этого в python через модуль re, используя отрицательное регулярное выражение на основе lookahead.

>>> import re 
>>> s = '''2015-12-02T17:56:13.783276Z our-elb-prod 52.20.50.51:60944  10.30.0.32:80 0.000024 0.063357 0.000066 200 200 0 12164 "GET  http://www.example.com:80/episodes/2014/10/ HTTP/1.0" "IgnitionOneBot/Nutch-1.9 (
This is the IgnitionOne Company Bot for Web Crawling. 
IgnitionOne Company Site: http://www.example.com/ 
    ; 
rong2 dot huang at ignitionone dot com 
)" - -''' 
>>> re.sub(r'\n(?!\d{4}-\d{2}-\d{2}T\d)', '', s) 
'2015-12-02T17:56:13.783276Z our-elb-prod 52.20.50.51:60944  10.30.0.32:80 0.000024 0.063357 0.000066 200 200 0 12164 "GET  http://www.example.com:80/episodes/2014/10/ HTTP/1.0" "IgnitionOneBot/Nutch-1.9 (This is the IgnitionOne Company Bot for Web Crawling.IgnitionOne Company Site: http://www.example.com/ ; rong2 dot huang at ignitionone dot com )" - -' 

т.е.

import re 
with open(file) as f: 
    fil = f.read() 
    print re.sub(r'\n(?!\d{4}-\d{2}-\d{2}T\d)', '', s) 
+1

Благодаря Авинаш! отлично подходит для того, что я искал. – user129545

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