2010-07-06 3 views
2

Существует ли стандарт Pythonic для использования регулярных выражений?Стиль регулярного выражения Python

Что я обычно делаю, это выполнить группу re.compile инструкций в верхней части моего модуля и хранить объекты в глобальных переменных ... а затем использовать их в моих функциях и классах.

Я мог бы определять регулярные выражения внутри функций, которые я использовал бы, но тогда они будут перекомпилированы каждый раз.

Или я мог бы полностью отказаться от re.compile, но если я использую одно и то же регулярное выражение много раз, кажется, что перекомпиляция потребует ненужных накладных расходов.

ответ

6

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

PATTERNS = {'pattern1': re.compile('foo.*baz'), 
      'snake': re.compile('python'), 
      'knight': re.compile('[Aa]rthur|[Bb]edevere|[Ll]auncelot')} 

Это было бы решить проблему, связанную с загрязненным пространство имен, плюс это довольно очевидно для тех, кто смотрит на свой код, что СХЕМЫ есть и будет используется для и удовлетворяет требованиям CAPS для глобальных переменных. Кроме того, вы можете легко позвонить по номеру re.match(PATTERNS[pattern]) или что бы вы ни делали для своей логики.

+0

Мне это очень нравится! Благодаря! –

1

Я лично использую ваш первый подход, в котором выражения, которые я буду повторно использовать, собираются на ранней стадии и доступны глобально для функций/методов, которые будут им нужны. По моему опыту это является надежным и сокращает общее время компиляции для них.

4

Я также использую ваш первый подход, но я никогда не сравнивал это. Одна вещь, чтобы отметить, from the documentation, что:

скомпилированные варианты самых последних моделей, переданных re.match(), re.search() или re.compile() кэшируются, поэтому программы, используйте только несколько регулярных выражений за раз. не стоит беспокоиться о компиляции регулярных выражений.

Одно из опасений заключается в том, что у вас могут быть регулярные выражения, которые не будут использоваться. Если вы компилируете все выражения во время загрузки модуля, вы можете взять на себя затраты на компиляцию выражения, но никогда не получаете выгоду от этой «оптимизации». Я не думаю, что это имело бы значение, если вы не компилируете лоты регулярных выражений, которые никогда не будут использоваться.

Одна вещь, которую я рекомендую, это использовать флаг (или re.X) и включать комментарии и пробелы, чтобы сделать что-либо за пределами обычного тривиального регулярного выражения более читаемым.

+0

Причина, по которой мне не нравится мой первый подход, заключается в том, что он забивает пространство имен, а фактический код не связан с кодом, который его запускает. Хотелось бы, чтобы облегчить чтение кода. –

+0

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

+1

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

Смежные вопросы