2015-11-06 5 views
2

Как я могу захватить не только совпадение, но и номер строки, на которой он появляется?Как найти строку, в которой появляется регулярное выражение, используя Python

У меня есть следующий сценарий:

re.findall(pattern, a_file.read(), re.MULTILINE)

Примечание: У меня есть много файлов для разбора, и предпочел бы не читать (или перечитать) файл строку за строкой.

ответ

3

Пробуйте выполнить через каждую строку (со счетом), чтобы определить, какой номер строки можно найти. Это может выглядеть примерно так:

with open('somefile.txt', 'r') as a_file: 
    linecount = 0 
    for line in a_file: 
     linecount += 1 
     result = re.findall(pattern, line) 
     ... 
+0

Я думаю, что будет. потребляют больше памяти и значительно замедляют процесс. – zadrozny

+0

Насколько велика ваш файл? Если вы откроете файл за раз, это не будет проблемой. Кроме того, он будет требовать итерации через файл так или иначе. Этого нельзя избежать. – McGlothlin

+1

Возможно, стоит упомянуть, что 're' не может отслеживать номера строк сам по себе, поэтому он потребует какой-то линейной итерации. – McGlothlin

0

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

Если у вас есть доступ к машине Linux, или командной строки эмулятор как cmder вы можете сделать следующее:

find . -name "*.java" -exec grep -n -E "LOGGER.\w+\(" {} \; 

Параметр -n получает вас номер строки, а -E указывает, что Grep должен выглядеть для шаблона, а не буквальное совпадение. В этом примере отображаются все * .java-файлы в текущей структуре каталогов (текущая папка и все вложенные папки) и выполняется поиск каждого найденного для строк типа LOGGER.info ("," LOGGER.debug ("," LOGGER.error (», который показывает мне все мои инструкции регистрации в моем java-коде, но не инструкции, в которых инициализируется LOGGER.

Как правило, вы обнаружите, что это также намного быстрее, чем использование одного скрипта python снова и снова, или даже цикл через файлы с питона скриптом

Edit:. Один примечания стороны - если вы используете окно консоль эмулятор, окончательный "\;" изменяется на простой ";"

Смежные вопросы