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






Чтобы избежать путаницы, прочтите следующее по порядку.
Во-первых, у вас есть модуль шарик, который обрабатывает регулярные выражения имени файла так же, как оболочки Windows и unix.
Во-вторых, у вас есть модуль fnmatch, который просто выполняет сопоставление с образцом с использованием правил оболочки unix.
В-третьих, у вас есть модуль повторно, который представляет собой полный набор регулярных выражений.
Затем задайте другой, более конкретный вопрос.
Ваш вопрос немного непонятен. Вы говорите, что хотите регулярное выражение, но может быть, вам нужен шаблон в стиле глобуса, который можно использовать с такими командами, как ls? Выражения glob и регулярные выражения похожи по концепции, но различаются на практике (регулярные выражения значительно мощнее, шаблоны стиля glob проще в наиболее распространенных случаях при поиске файлов.
Кроме того, что вы считаете шаблоном? Конечно, шаблону будет соответствовать * (glob) или. * (Regex). Кроме того, будет соответствовать шаблон _test.ext (glob) или._test.ext (regexp), как и многие другие варианты.
Не могли бы вы уточнить узор? Например, вы можете описать это как «b, за которым следуют цифры, за которым следует cv, за которым следуют цифры ...»
Как только вы сможете точно объяснить шаблон на своем родном языке (а это должен быть ваш первый шаг), обычно довольно просто перевести это в шаблон глобуса или регулярного выражения.
если буквы не важны, вы можете попробовать \ w \ d \ d \ d \ w \ w \ d \ d_test.ext, который будет соответствовать шаблону буквы / цифры, или b \ d \ d \ dcv \ d \ d_test.ext или какое-то их сочетание.
При работе с регулярными выражениями я считаю, что Пример регулярного выражения Mochikit очень помогает.
/^b\d\d\dcv\d\d_test\.ext$/
Затем используйте модуль python re (regex) для сопоставления. Это, конечно, предполагает, что регулярное выражение действительно то, что вам нужно, а не глобальное выражение, как упоминалось другими.
I would like the pattern to be as follows: must start with 'b', followed by three digits, followed by 'cv', followed by two digits, then an underscore, followed by 'release', followed by .'ext'
^b\d{3}cv\d{2}_release\.ext$
Теперь, когда у вас есть удобочитаемое описание имени файла, довольно просто перевести его в регулярное выражение (по крайней мере, в этом случае;)
must start with
Каретка (^) привязывает регулярное выражение к началу того, что вы хотите сопоставить, поэтому ваше re должно начинаться с этого символа.
'b',
Любой неспециальный символ в вашем re будет соответствовать буквально, поэтому вы просто используете «b» для этой части: ^b.
followed by [...] digits,
Это немного зависит от того, какой аромат re вы используете:
Самый общий способ выразить это - использовать скобки ([]). Они означают «соответствует любому из символов, перечисленных внутри. [ASDF], например, будет соответствовать либо A, либо S, либо D, либо F, [0-9] будет соответствовать любому из значений от 0 до 9.
В вашей библиотеке, вероятно, есть ярлык для «любой цифры». В sed и awk вы можете использовать [[:digit:]] [sic!], В Python и многих других языках вы можете использовать \d.
Итак, теперь ваш re читает ^b\d.
followed by three [...]
Самый простой способ выразить это - просто повторить атом три раза следующим образом: \d\d\d.
Опять же, ваш язык может содержать ярлык: фигурные скобки ({}). Иногда вам придется экранировать их с помощью обратной косой черты (если вы используете sed или awk, прочтите о «расширенных регулярных выражениях»). Они также дают вам возможность сказать «по крайней мере x, но не более чем y вхождений предыдущего атома»: {x,y}.
Теперь у вас есть: ^b\d{3}
followed by 'cv',
Снова буквальное сопоставление, теперь у нас есть ^b\d{3}cv
followed by two digits,
Мы уже рассмотрели это: ^b\d{3}cv\d{2}.
then an underscore, followed by 'release', followed by .'ext'
Опять же, все это должно совпадать буквально, но точка (.) - это специальный символ. Это означает, что вы должны экранировать его с помощью обратной косой черты: ^\d{3}cv\d{2}_release\.ext
Отсутствие обратной косой черты будет означать, что имя файла, например, «b410cv11_test_ext», также будет соответствовать, что может или не может быть проблемой для вас.
Наконец, если вы хотите гарантировать, что после ".ext" больше ничего нет, привяжите re к концу объекта для сопоставления, используйте знак доллара ($).
Таким образом, полное регулярное выражение для вашей конкретной проблемы будет:
^b\d{3}cv\d{2}_release\.ext$
Легкий.
Какой бы язык или библиотеку вы ни использовали, где-нибудь в документации должна быть ссылка, которая покажет вам, каким должен быть точный синтаксис в вашем случае. Как только вы научитесь разбивать проблему на подходящее описание, понимание более сложных конструкций будет приходить к вам шаг за шагом.
Вроде как вы это написали :-)
И, кстати, я хотел бы указать на dabeaz.com/generators/Generators.pdf как на хорошее введение в генераторы, где вы можете узнать, как создать Python замену для «find» и «grep».
Большое спасибо за очень четкое, краткое и подробное объяснение. Мне также понравилось, как вы пришли к выражению - я буду использовать эту поэтапную методологию, пока этот процесс не станет для меня более привычным. Прекрасное объяснение для новичка. Еще раз спасибо!
каков фактический шаблон файла? из примера один мы не можем экстраполировать то, что вы хотите.