1

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

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

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

+0

Вы могли бы прояснить, что именно вы на самом деле пытаетесь достичь? – si28719e

ответ

2

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

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

3

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

(?si)^a.*z$ 

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

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

Резюмируя: (cut'n'paste из указанной выше ссылке)

(iLmsux?)

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

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

3

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