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