--}}
Новая тема
Вы не можете создавать новые темы.
Т.к. вы неавторизованы на сайте. Пожалуйста назовите себя или зарегистрируйтесь.
Список тем

Regular expressions в Python

Серьёзная тема
11
17
С друзьями на NN.RU
В социальных сетях
Поделиться
Collins
29.08.2016
Вопрос к знатокам regular expressions в Python-е.
Код в цикле читает построково файл.

Необходимо следующее:
(1) распознать строки, которые соответствуют определенному паттерну, а именно, включение файлов с предопределенными расширениями (ext1 & ext2):
#include "file_name1.ext1"
#include "subdir/file_name2.ext2"
Число пробелов после include может быть произвольным.

(2) В конечном результате выдать имя файла, включая поддиректорию, если она присутствует.
В случае вышепреведенного примера ожидаемый результат для первой строки file_name1.ext1, для второй - subdir/file_name2.ext2.

Вообщем буду благодарен за подсказку, а иначе придется завтра в рабочее время изучать все хитросплетения regular expressions в Питоне, чтобы не парсить строки вручную функциями типа endswith.

Заранее спасибо.
CiViLiS
29.08.2016
for m in re.finditer(r'^\s+#include\s+["<]([^">]+)[">]$', text, re.MULTILINE):
print(m.group(1))

Но этот пример не учитывает Ifdefы многострочные комментарии и т.д. Поэтому чтобы получить список инклюдов, лучше использовать проверенные временем решения (вроде в визулстидии была такая возможность, еще что то я пользовал под линукс).

Если есть задача использовать именно питон, то нужно писать нормальный парсер, например на https://docs.python.org/2/library/parser.html Ну или брать готовый, например https://pypi.python.org/pypi/CppHeaderParser/ (не разу не использовал, первая строчка в гугле)
alxumuk2
29.08.2016
Добавлю свои 5 копеек - если надо парсить серьезно, то стоит взять что-то типа ANTLR, подцепить грамматику нужного языка (популярные грамматики есть), построить AST и ходить по нему.
Сомневаюсь, что это то, что надо ТС, но в моей практике было, как минимум 2 случая, когда после регэкспа приходилось заниматься грамматикой.

Хотя мне кажется, что тупой регэксп сработает для локальной задачи. Статистически обычно срабатывает :)
Collins
30.08.2016
Ничего серьезно парсить не надо. У меня есть мой скриптик, который пробегает по всем объектникам, сгенерированных для c/cpp/dts/dtsi файлов, и собирает полный список того, что было использовано для построения ядра. Тоже самое для отдельных приложений юзерспейса. Суппер удобно, несколько секунд и список для проекта SI из нескольких тысяч файлов готов. Но там парсинг сделан "вручную", надо бы доработать. В данный момент хочу написать скрипт, который предоставляет информацию из dts/dtsi файлов в удобоварительном виде. Это, так сказать, мое собственное "домашнее задание" на сегодня, которое в дальнейшем должно упростить жизнь.
Collins
30.08.2016
Частично работает. Осталось разобраться, как в приведенный пример добавить предопределенные .ext1 и .ext2?
CiViLiS
30.08.2016
нипонял что за предопределенные ексты. :-(
Collins
30.08.2016
Например, если в тексте встречается include директива с .h файлом, то мне хотелось бы ее проигнорировать, а include директивы для, например .dts файлов, обработать.
CiViLiS
30.08.2016
В данном случае, хотелки скорее всего будут достаточно часто меняться, а вот регэксп менять -- то еще удовольствие, поэтому тут проще с endswith и os.path.splitext.
перформанс тож не пострадает в этом случае, ибо самое сложно и долгое сделает модуль re, а на фильтрацию путей много времени не займет, так как путей мало, по сравнению с числом строчек во всех файлах.
Qavai
30.08.2016
как-то так, если я понял, что хочет автор

r'^\s+#include\s+["<]([^">]+)\.(ext1|ext2)[">]$
Collins
31.08.2016
О, спасибо! Похоже на то что надо. Вечером попробую заменить свою реализацию на эту. А то я все глаза сломал, колдуя с этими китайскими иероглифами.
Qavai
31.08.2016
совершенно несложно реализовать это и на строчных функциях.

например, на js

var s = '#include "file_name1.ext1"';

var j = s.indexOf('#include');
if (j != -1) {
s = s.substr(j);
j = s.indexOf('"');
if (j != -1) {
s = s.substr(j);

j = s.indexOf('"');
if (j != -1) {
s = s.substr(0, j);
}
}
}


как-то так
alxumuk2
31.08.2016
Регэксп будет, как минимум, быстрее.
Да и погибче
Collins
31.08.2016
Ну примерно так до настоящего времени и было реализовано. Захотелось сделать правильно, параллельно изучив эту китайскую грамоту.
Qavai
31.08.2016
а нет такого понятия, как правильно.

для каждого случая свой инструмент.

и регулярки медленнее, чем строки, раз в 10
CiViLiS
31.08.2016
> и регулярки медленнее, чем строки, раз в 10

Ну ооочень смелое заявление
Drowt
02.09.2016
Welcome to circle :-)
а причем тут Питон?
регексы это вещь сама по себе
их обычно отлаживают в каком либо онлайн едиторе, а потом уже используют в коде
к тому же как правило не ты первый своей частной задачей озадачился, в гугле наверняка уже спрашивали и отвечали, ну вот похоже первая ссылка:
https://www.google.ru/webhp?...ude%20directives
Новая тема
Вы не можете создавать новые темы.
Т.к. вы неавторизованы на сайте. Пожалуйста назовите себя или зарегистрируйтесь.
Список тем
Последние темы форумов
Прибор Мультиметр Chauvin Arnoux c.A 5260

Мультиметр "chauvin arnoux c.A 5260"- франция Производитель: chauvin arnoux, франция гост реестр рф: 20275-07 лежал в...
Цена: 18 000 руб.

Преобразователь вторичный универсальный УВП-01 НОВЫЙ .

Преобразователь вторичный универсальный УВП-01 НОВЫЙ Цена 8000 руб Торга ННЕттт Вышлю в регионы после оплаты Не...
Цена: 8 000 руб.

Подкладка КБ65 бу ГОСТ 16277-93 предлагаем к отгрузке

Подкладка КБ-65 ГОСТ 16277-2016, на складе в нескольких вариантах: новая, б/у. Доставка по России, или на самовывоз, с нашего...

Прокладка резиновая ЦП–638 Нашпальная ЖБР ГОСТ Р 56291-2014

Прокладка резиновая ЦП-638 предназначена для рельсового скрепления ЖБР. Прокладка резиновая цп-638 используется для обеспечения...

Программист 1С НПП ПРО-М
от 110 000 руб.
Высшее образование, стаж работы 3-5 лет, полная занятость
Программист-разработчик Full-Stack ГК "Kolobox"
70000 -
100000 руб.
Высшее образование, стаж работы более 5 лет, полная занятость
Разработчик .net Profit Search
70000 -
100000 руб.
Неполное среднее образование, стаж работы 3-5 лет, полная занятость
Frontend-разработчик Profit Search
40000 -
50000 руб.
Стаж работы 3-5 лет, частичная занятость