Как искать шаблон в текстовом файле, используя Python, объединяющий регулярные выражения и операции с строками/файлами и сохраняющие экземпляры шаблона?
Итак, по сути, я ищу специально четырехзначный код в двух угловых скобках в текстовом файле. Я знаю, что мне нужно открыть текстовый файл, а затем разбор строки за строкой, но я не уверен, что лучший способ структурировать мой код после проверки "для строки в файле".
Я думаю, что могу либо как-то разбить его, разбить, либо раздел, но я также написал регулярное выражение, которое я использовал для компиляции, и поэтому, если он возвращает объект соответствия, я не думаю, что могу использовать его с этими строковыми операции. Также я не уверен, является ли мое регулярное выражение достаточно жадным или нет...
Я хотел бы сохранить все экземпляры найденных ударов как строки в кортеже или списке.
Вот мое регулярное выражение:
regex = re.compile("(<(\d{4,5})>)?")
Я не думаю, что мне нужно включить весь этот код, учитывая его довольно простой до сих пор.
Ответы
Ответ 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()
Но по-прежнему просто смысл читать весь файл сразу.