Python, как получить определенное количество строк после матча - PullRequest
1 голос
/ 22 июня 2011

Допустим, у меня есть входной текстовый файл следующего формата:

Section1 Heading    Number of lines: n1
Line 1
Line 2
...
Line n1
Maybe some irrelevant lines

Section2 Heading    Number of lines: n2
Line 1
Line 2
...
Line n2

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

Я написал регулярное выражение, которое будет соответствовать строке заголовка на основе имени заголовка, которое пользователь ищет для каждого раздела, анализирует его, а затем возвращает число n1 / n2 / etc, которое говорит мне, сколько строк в разделе , Я пытался использовать цикл for-in для чтения каждой строки, пока счетчик не достигнет n1, но до сих пор это не сработало.

Вот мой вопрос: как вернуть только определенное количество строк, следующих за совпавшей строкой, если это число указано в совпадении и отличается для каждого раздела? Я новичок в программировании, и я ценю любую помощь.

РЕДАКТИРОВАТЬ: Хорошо, вот соответствующий код, который у меня есть:

import re
print
fname = raw_input("Enter filename: ")
toolname = raw_input("Enter toolname: ")

def findcounter(fname, toolname):
        logfile = open(fname, "r")

        pat = 'SUCCESS Number of lines :'
        #headers all have that format
        for line in logfile:
                if toolname in line:
                    if pat in line:
                            s=line

        pattern = re.compile(r"""(?P<name>.*?)     #starting name
                             \s*SUCCESS        #whitespace and success
                             \s*Number\s*of\s*lines  #whitespace and strings
                             \s*\:\s*(?P<n1>.*)""",re.VERBOSE)
        match = pattern.match(s)
        name = match.group("name")
        n1 = int(match.group("n1"))
        #after matching line, I attempt to loop through the next n1 lines
        lcount = 0
        for line in logfile:
             if line == match:
                    while lcount <= n1:
                                match.append(line)
                                lcount += 1
                                return result

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

Ответы [ 2 ]

1 голос
/ 22 июня 2011
# f is a file object
# n1 is how many lines to read
lines = [f.readline() for i in range(n1)]
0 голосов
/ 22 июня 2011

Вы можете поместить такую ​​логику в генератор:

def take(seq, n):
    """ gets n items from a sequence """
    return [next(seq) for i in range(n)]

def getblocks(lines):
    # `it` is a iterator and knows where we are in the list of lines.
    it = iter(lines)
    for line in it:
        try:
            # try to find the header:
            sec, heading, num = line.split()
            num = int(num)
        except ValueError:
            # didnt work, try the next line
            continue

        # we got a header, so take the next lines
        yield take(it, num) 

#test
data = """
Section1 Heading  3
Line 1
Line 2
Line 3

Maybe some irrelevant lines

Section2 Heading 2
Line 1
Line 2
""".splitlines()

print list(getblocks(data))
...