Como armazenar expressões regulares no armazenamento de dados do Google App Engine?
-
12-09-2019 - |
Pergunta
Expressões regulares são geralmente expressas como cordas, mas também possuem propriedades (ou seja, linha única, linha múltipla, Ignore Case). Como você os armazenaria? E para expressões regulares compiladas, como armazená -lo?
Observe que podemos escrever aulas de propriedade personalizadas: http://googleappgen.blogspot.com/2009/07/writing-custom-property-classes.html
Como não entendo o Python o suficiente, minha primeira tentativa de escrever uma propriedade personalizada que armazena uma expressão regular compilada falhou.
Solução
Você pode armazenar o texto, como sugerido acima, ou pode apagar e descompactar o RE compilado. Por exemplo, veja PickledProperty no livro de receitas.
Devido à (falta de) velocidade de picles, particularmente no mecanismo de aplicativos onde o CPickle não está disponível, você provavelmente encontrará que armazenar o texto do regex é a opção mais rápida. De fato, parece que, quando em conserva, e simplesmente armazena o texto original de qualquer maneira.
Outras dicas
Não tenho certeza se o Python o supra, mas no .Net Regex, você pode especificar essas opções dentro do próprio Regex:
(?si)^a.*z$
especificaria uma linha única e ignorar o caso.
De fato, os documentos Python descrevem esse mecanismo aqui: http://docs.python.org/library/re.html
Para recapitular: (corte'n'Paste do link acima)
(? Ilmsux)
(Uma ou mais letras do conjunto 'i', 'l', 'm', 's', 'u', 'x'.) O grupo corresponde à corda vazia; As cartas definem os sinalizadores correspondentes: re.i (Ignore Case), Re.l (Locale Dependending), Re.M (Multi-line), Re.S (DOT corresponde a todos), RE.U (Unicode dependente) e re.x (detalhado), para toda a expressão regular. (Os sinalizadores são descritos no conteúdo do módulo.) Isso é útil se você deseja incluir os sinalizadores como parte da expressão regular, em vez de passar um argumento de sinalizador para a função compile ().
Observe que o sinalizador (? X) muda como a expressão é analisada. Ele deve ser usado primeiro na sequência de expressão ou após um ou mais caracteres de espaço em branco. Se houver caracteres não-espaciais antes da bandeira, os resultados serão indefinidos.
Eu não tentaria armazenar o regex compilado. Os dados em um regex compilado não foram projetados para serem armazenados e não são garantidos para serem preenchidos ou serializáveis. Basta armazenar a string e recompilar (o módulo RE fará isso por você nos bastidores).