Python - однострочный или многострочный REGEX

Принимая во внимание следующий текстовый образец,

# цели: временная метка отчета процесса, например. 2011-09-21 15:45:00 и первые две статданные в succ. строка статистики, например: 1438 1439

input_text = '''
# Process_Name     ( 23387) Report at 2011-09-21 15:45:00.001    Type:  Periodic    #\n
some line 1\n
some line 2\n
some other lines\n
succ. statistics |     1438     1439  99 |   3782245    3797376  99 |\n
some lines\n
Process_Name     ( 23387) Report at 2011-09-21 15:50:00.001    Type:  Periodic    #\n
some line 1\n
some line 2\n
some other lines\n
succ. statistics |     1436     1440  99 |   3782459    3797523  99 |\n
repeat the pattern several hundred times...
'''

Я получил его работать при итерации строки в строку,

def parse_file(file_handler, patterns):

    results = []
    for line in file_handler:
        for key in patterns.iterkeys():
            result = re.match(patterns[key], line)
            if result:
                results.append( result )

return results

patterns = {
    'report_date_time': re.compile('^# Process_Name\s*\(\s*\d+\) Report at (.*)\.[0-9]   {3}\s+Type:\s*Periodic\s*#\s*.*$'),
    'serv_term_stats': re.compile('^succ. statistics \|\s+(\d+)\s+   (\d+)+\s+\d+\s+\|\s+\d+\s+\d+\s+\d+\s+\|\s*$'),
    }
results = parse_file(fh, patterns)

возвращая

[('2011-09-21 15:40:00',),
('1425', '1428'),
('2011-09-21 15:45:00',),
('1438', '1439')]

, но имея список кортежей вывод в качестве моей цели,

[('2011-09-21 15:40:00','1425', '1428'),
('2011-09-21 15:45:00', '1438', '1439')]

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

# .+?   Lazy quantifier "match as few characters as possible (all characters allowed) until reaching the next expression"
pattern = '# Process_Name\s*\(\s*\d+\) Report at (.*)\.[0-9]{3}\s+Type:\s*Periodic.*?succ. statistics) \|\s+(\d+)\s+(\d+)+\s+\d+\s+\|\s+\d+\s+\d+\s+\d+\s+\|\s'
regex = re.compile(pattern, flags=re.MULTILINE)

data = file_handler.read()    
for match in regex.finditer(data):
    results = match.groups()

Как я могу это сделать?

-121--1812995- Очистить NSLog - Нет метки времени и имени программы Я почти закончил чистую NSLog с этим кодом: # define NSLog (FORMAT,...) printf («% s\n», [[NSString stringWeyFormat: FORMAT AT AT, __ VA A A _ __ Эта работа прекрасно, если я делаю это: NSLog (@ "Показать...

Я почти заканчиваю чистый NSLog с этим кодом:

#define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, __VA_ARGS__] UTF8String]);

Это работает прекрасно, если я делаю это:

 NSLog(@"Show %@ message", @"this");

Но, будет неудачно, если я использую его

 NSLog(@"One argument");

, потому что __ VA _ ARGS __ ничего, поэтому он производит

 printf("%s\n", [[NSString stringWithFormat:@"One argument",] UTF8String]);

Так что проблема в запятую. Поскольку это макрос, __ VA _ ARGS __ ничего не значит. Поэтому я не могу делать такие вещи, как __ VA _ ARGS __ = = nil , потому что произведет = = nil и потерпит неудачу.

Вопрос прост: Что делать, когда __ VA _ ARGS __ ничто? Или используйте запятую только при наличии дополнительных аргументов.

26
задан Albert Renshaw 28 July 2018 в 01:49
поделиться