Пользователи моего приложения могут настроить макет определенных файлов через строку формата.
Например, значение конфигурации, указанное пользователем, может быть:
layout = '%(group)s/foo-%(locale)s/file.txt'
Теперь мне нужно найти все такие файлы, которые уже существуют. Это кажется достаточно простым, используя модуль glob :
glob_pattern = layout % {'group': '*', 'locale': '*'}
glob.glob(glob_pattern)
Однако теперь наступает сложная часть: учитывая список глобальных результатов, мне нужно получить все те части имени файла, которые соответствуют заданному заполнителю, например все различные значения «локали».
Я подумал, что сгенерирую регулярное выражение для строки формата, которое затем смогу сопоставить со списком результатов глоба (или, возможно, пропустить глоб и выполнить все сопоставления самостоятельно).
Но я не могу найти хороший способ создать регулярное выражение как с правильными захватами группы, так и с экранированием остальной части ввода.
Например, это может дать мне регулярное выражение, соответствующее локали:
regex = layout % {'group': '.*', 'locale': (.*)}
Но чтобы убедиться в правильности регулярного выражения, мне нужно пропустить его через re.escape (), который затем также избегает синтаксиса регулярного выражения, который я только что вставил. Вызов re.escape () сначала разрушает строку формата.
Я знаю, что есть fnmatch.translate (), который даже дал бы мне регулярное выражение - но не тот, который возвращает нужные группы.
Есть ли хороший способ сделать это без взлома, например, заменить заполнители уникальным значением, безопасным для регулярных выражений и т. Д .?
Возможно, есть какой-нибудь способ (возможно, сторонняя библиотека?), Который позволяет более гибко разбирать строку формата, например, разбивать строку в местах размещения?