Подтвердить что ты не робот

Как искать шаблон в текстовом файле, используя Python, объединяющий регулярные выражения и операции с строками/файлами и сохраняющие экземпляры шаблона?

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

Я думаю, что могу либо как-то разбить его, разбить, либо раздел, но я также написал регулярное выражение, которое я использовал для компиляции, и поэтому, если он возвращает объект соответствия, я не думаю, что могу использовать его с этими строковыми операции. Также я не уверен, является ли мое регулярное выражение достаточно жадным или нет...

Я хотел бы сохранить все экземпляры найденных ударов как строки в кортеже или списке.

Вот мое регулярное выражение:

regex = re.compile("(<(\d{4,5})>)?")

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

4b9b3361

Ответ 1

import re
pattern = re.compile("<(\d{4,5})>")

for i, line in enumerate(open('test.txt')):
    for match in re.finditer(pattern, line):
        print 'Found on line %s: %s' % (i+1, match.group())

Несколько замечаний о регулярном выражении:

  • Вам не нужно ? в конце и внешнем (...) если вы не хотите сопоставлять число с угловыми скобками, а хотите только само число
  • Соответствует 4 или 5 цифрам в угловых скобках

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

Подробнее о регулярных выражениях в python можно узнать здесь: HOWTO о регулярных выражениях

Ответ 2

Выполняя это в одном объеме, прочитайте:

import re

textfile = open(filename, 'r')
filetext = textfile.read()
textfile.close()
matches = re.findall("(<(\d{4,5})>)?", filetext)

Строка за строкой:

import re

textfile = open(filename, 'r')
matches = []
reg = re.compile("(<(\d{4,5})>)?")
for line in textfile:
    matches += reg.findall(line)
textfile.close()

Но снова возвращаемые совпадения не будут полезны ни для чего, кроме подсчета, если вы не добавили счетчик смещения:

import re

textfile = open(filename, 'r')
matches = []
offset = 0
reg = re.compile("(<(\d{4,5})>)?")
for line in textfile:
    matches += [(reg.findall(line),offset)]
    offset += len(line)
textfile.close()

Но по-прежнему просто смысл читать весь файл сразу.