читать фрагмент файла с регулярными выражениями из текстового файла в Python - PullRequest
1 голос
/ 12 марта 2012

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

HERE IS MY PATTERN:


        IGNORE SECTION

**************************************************
START   1   2   3   4   5
  .     .   .   .   .   .
  .     .   .   .   .   .
  .     .   .   .   .   .
END     .   .   .   .   .



TEXT    FILE    CONTINUES...........
.
.
.
.

**************************************************

Как мне сказать Python читать в строках на 5 строк ниже шаблона и останавливаться при чтении в первой пустой строке ?

Вот мой сценарий:

#!usr/bin/env python

import re

pattern = r'PATTERN:'+'$'

count = 0
fp = open('fileinput.txt')
for line in fp:
    count += 1

    match = re.search(pattern,line)
    if match:
        print 'Matched text:', line, 'Line', count
        line_match = count   

new_line = line_match+4

Я отметил нужную мне строку, но не могу сказать Python начать чтение файла с этого момента и завершить работу, когда он достигнет пустой строки. Любые советы?

Ответы [ 2 ]

2 голосов
/ 12 марта 2012

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

matching = False
found = []
with open('fileinput.txt', 'r') as file
    it = iter(file)
    for line in it:
        if matching:
            if line.strip() == '':
                break
            else:
                found.append(line)
        elif line.endswith('PATTERN:'):
            for _ in range(6):
                next(it)
            matching = True

Поскольку вы знаете, что START происходит через 5 строк после PATTERN, искать его не нужно, поэтому вместо этого я использовал assert дляубедитесь, что это там, где ожидается.Соответствующие строки сохраняются в found, и вы можете красиво распечатать их с помощью

for line in found:
    print line
0 голосов
/ 12 марта 2012

Я не очень хорошо понял ваши объяснения; из того, что я смог понять, нужно:

1) читать файл из определенного шаблона до пустой строки;
2) сопоставить прочитанную часть с многострочным шаблоном.

Для этого:

1) Считайте весь интересующий вас текст в одну переменную с помощью readline(), readlines(), xreadlines() или for line in file - что бы ни было наиболее удобным.
Обратите внимание, что цикл for line if file может быть остановлен с помощью break в любое время, а xreadlines() - просто остановлен для чтения с него. В следующий раз, когда они будут вызваны, они начнут с текущей позиции в файле.
2) сопоставьте его с шаблоном, содержащим \n, или используйте флаг re.M, если вам нужно ., чтобы соответствовать символам новой строки.

for l in f:
    if re.match("PATTERN:\n",l): break
s=""
for l in f:
    if l=='\n': break
    s+=l
m=re.match("<whatever-pattern-matches-your-chunk-of-text>",s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...