Как я могу перевести следующее имя файла в регулярное выражение в Python? - PullRequest
2 голосов
/ 22 ноября 2008

Сейчас я борюсь с регулярными выражениями, когда набираю текст.

Я хотел бы определить шаблон для следующего файла примера: b410cv11_test.ext. Я хочу иметь возможность выполнять поиск файлов, которые соответствуют шаблону файла примера, упомянутого выше. С чего начать (так потерян и растерян) и как лучше всего найти решение, которое лучше всего соответствует шаблону файла? Заранее спасибо.

Дальнейшее уточнение вопроса:

Мне бы хотелось, чтобы шаблон был следующим: должен начинаться с 'b', за которым следуют три цифры, затем 'cv', затем две цифры, затем подчеркивание, затем 'release' и затем. вн '

Ответы [ 6 ]

11 голосов
/ 22 ноября 2008

Теперь, когда у вас есть удобочитаемое описание имени вашего файла, довольно просто перевести его в регулярное выражение (по крайней мере, в этом случае;)

должно начинаться с

Символ каретки (^) привязывает регулярное выражение к началу того, что вы хотите сопоставить, поэтому ваш повтор должен начинаться с этого символа.

'б',

Любой нестандартный символ в вашем ре будет совпадать буквально, поэтому вы просто используете «b» для этой части: ^b.

, за которыми следуют [...] цифры,

Это немного зависит от того, какой вкус вы используете:

Наиболее общий способ выразить это - использовать скобки ([]). Это означает, что "соответствует любому из символов, перечисленных в. [ASDF], например, будет соответствовать либо A, либо S, либо D, либо F, [0-9] будет совпадать с любым значением от 0 до 9.

В вашей библиотеке, вероятно, есть ярлык "любая цифра". В sed и awk вы можете использовать [[:digit:]] [sic!], В python и многих других языках вы можете использовать \d.

Так что теперь вы читаете ^b\d.

, за которыми следуют три [...]

Самый простой способ выразить это - просто повторить атом три раза так: \d\d\d.

Опять же, ваш язык может содержать ярлык: фигурные скобки ({}). Иногда вам придется избегать их с обратной косой чертой (если вы используете sed или awk, прочитайте о «расширенных регулярных выражениях»). Они также дают вам возможность сказать «хотя бы x, но не более y вхождений предыдущего атома»: {x,y}.

Теперь у вас есть: ^b\d{3}

с последующим 'cv',

Буквальное соответствие снова, теперь у нас есть ^b\d{3}cv

, за которыми следуют две цифры,

Мы уже рассмотрели это: ^b\d{3}cv\d{2}.

затем подчеркивание, затем 'release', затем.'Ext '

Опять же, все это должно совпадать буквально, но точка (.) - это специальный символ. Это означает, что вы должны избежать его с обратной косой чертой: ^\d{3}cv\d{2}_release\.ext

Если оставить обратную косую черту, это будет означать, что имя файла, такое как "b410cv11_test_ext", также будет соответствовать, что может быть или не быть проблемой для вас.

Наконец, если вы хотите гарантировать, что после ".ext" больше ничего нет, закрепите точку до конца, чтобы соответствовать, используйте знак доллара ($).

Таким образом, полное регулярное выражение для вашей конкретной задачи будет:

^b\d{3}cv\d{2}_release\.ext$

Легко.

Какой бы язык или библиотеку вы ни использовали, где-то в документации должна быть ссылка, которая покажет вам, каким должен быть точный синтаксис в вашем случае. Как только вы научитесь разбивать проблему на подходящее описание, шаг за шагом к вам придет понимание более продвинутых конструкций.

4 голосов
/ 22 ноября 2008

Чтобы избежать путаницы, прочитайте по порядку следующее.

Во-первых, у вас есть модуль glob , который обрабатывает регулярные выражения имени файла так же, как оболочки Windows и unix.

Во-вторых, у вас есть модуль fnmatch , который просто выполняет сопоставление с шаблоном, используя правила оболочки unix.

В-третьих, у вас есть модуль re , который является полным набором регулярных выражений.

Тогда задайте другой, более конкретный вопрос.

3 голосов
/ 22 ноября 2008

Я бы хотел, чтобы шаблон был как следует: должен начинаться с 'b', а затем тремя цифрами, за которыми следует «cv», сопровождаемый двумя цифрами, затем подчеркивание с последующим «выпуском», с последующим .'ext '

^b\d{3}cv\d{2}_release\.ext$
1 голос
/ 22 ноября 2008

Ваш вопрос немного неясен. Вы говорите, что хотите регулярное выражение, но может ли быть так, что вам нужен шаблон в стиле glob, который вы можете использовать с такими командами, как ls? Глобальные выражения и регулярные выражения похожи по концепции, но различаются на практике (регулярные выражения значительно более эффективны, шаблоны стилей глобуса проще в наиболее распространенных случаях при поиске файлов.

Кроме того, что вы считаете шаблоном? Конечно, * (glob) или. * (Regex) будут соответствовать шаблону. Кроме того, шаблон _test.ext (glob) или. _test.ext (regexp) будет соответствовать, как и многие другие варианты.

Можете ли вы быть более точным в отношении шаблона? Например, вы можете описать его как «b, за которым следуют цифры, затем cv, а затем цифры ...»

Как только вы сможете точно объяснить шаблон на своем родном языке (и это должен быть ваш первый шаг), обычно довольно просто перевести его в шаблон глобуса или регулярного выражения.

0 голосов
/ 22 ноября 2008

При работе с регулярными выражениями я нахожу пример регулярного выражения *1001* Mochikit очень полезным.

/^b\d\d\dcv\d\d_test\.ext$/

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

0 голосов
/ 22 ноября 2008

если буквы не важны, вы можете попробовать \ w \ d \ d \ d \ w \ w \ d \ d_test.ext, который будет соответствовать шаблону буквы / цифры, или b \ d \ d \ dcv \ d \ d_test.ext или какое-то их сочетание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...