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.

Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top