Как хранить регулярные выражения в хранилище данных Google App Engine? - PullRequest
1 голос
/ 09 августа 2009

Регулярные выражения обычно выражаются в виде строк, но они также имеют свойства (т. Е. Однострочные, многострочные, игнорировать регистр). Как бы вы их сохранили? А для скомпилированных регулярных выражений, как его хранить?

Обратите внимание, что мы можем написать собственные классы свойств: http://googleappengine.blogspot.com/2009/07/writing-custom-property-classes.html

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

Ответы [ 3 ]

3 голосов
/ 09 августа 2009

Я бы не пытался хранить скомпилированное регулярное выражение. Данные в скомпилированном регулярном выражении не предназначены для хранения, и не гарантируется, что они могут быть выбраны или сериализуемы. Просто сохраните строку и перекомпилируйте (модуль re сделает это за вас за кулисами).

3 голосов
/ 09 августа 2009

Я не уверен, поддерживает ли это Python, но в .net regex вы можете указать эти параметры внутри самого регулярного выражения:

(?si)^a.*z$

будет указывать одну строку, игнорировать регистр.

Действительно, документы Python описывают такой механизм здесь: http://docs.python.org/library/re.html

Напомним: (вырезать из ссылки выше)

(? ILmsux)

(Одна или несколько букв из набора 'i', 'L', 'm', 's', 'u', 'x'.) Группа соответствует пустой строке; буквы устанавливают соответствующие флаги: re.I (игнорировать регистр), re.L (зависит от локали), re.M (многострочный), re.S (точка соответствует всем), re.U (зависит от Unicode) и re.X (многословный), для всего регулярного выражения. (Флаги описаны в Содержании модуля.) Это полезно, если вы хотите включить флаги как часть регулярного выражения вместо передачи аргумента флага в функцию compile ().

Обратите внимание, что флаг (? X) изменяет способ анализа выражения. Его следует использовать сначала в строке выражения или после одного или нескольких пробельных символов. Если перед флагом есть непробельные символы, результаты не определены.

2 голосов
/ 09 августа 2009

Вы можете либо сохранить текст, как предложено выше, либо вы можете выбрать и открепить скомпилированный RE. Например, см. PickledProperty в кулинарной книге.

Из-за (отсутствия) скорости Pickle, особенно в App Engine, где cPickle недоступен, вы, вероятно, обнаружите, что сохранение текста регулярного выражения - более быстрый вариант. На самом деле, похоже, что при мариновании re просто сохраняет исходный текст.

...