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

Regular expressions в Python

Серьёзная тема
10
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
Новая тема
Вы не можете создавать новые темы.
Т.к. вы неавторизованы на сайте. Пожалуйста назовите себя или зарегистрируйтесь.
Список тем
Последние темы форумов
Трансформатор ОСМ1-0.16у3

Трансформатор ОСМ1-0.16у3 160 ватт. Новый. Цена 2000 руб . Отправка в регионы после оплаты. Трансформаторы серии ОСМ1 мощностью 160...
Цена: 2 000 руб.

лазерная резка металла

Команда специалистов ООО БАРТОН предоставляет качественные услуги лазерной резки металла в Нижнем Новгороде на профессиональном...

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

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

Переменный вольтметр Э8021

Вольтметр переменный Э8021 Отправка в регионы после оплаты. Измерительные головки для радиолюбителей Э8021 НОВЫЕ не...
Цена: 500 руб.

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