正则表达式通常表示为字符串,但它们也具有属性(即单行,多行,忽略大小写)。你会怎么存储它们?对于编译的正则表达式,如何存储它?
请注意,我们可以编写自定义属性类:http://googleappengine.blogspot.com/2009/07/writing-custom-property-classes.html
由于我不太了解Python,我第一次尝试编写一个存储已编译正则表达式的自定义属性失败。
答案 0 :(得分:3)
我不确定Python是否支持它,但在.net regex中,您可以在正则表达式中指定这些选项:
(?si)^a.*z$
将指定单行,忽略大小写。
确实,Python文档在这里描述了这样一种机制:http://docs.python.org/library/re.html
回顾:(来自上面链接的cut'n'paste)
(?iLmsux)
(来自集合'i','L','m','s','u','x'的一个或多个字母。)该组匹配空字符串;字母设置相应的标志:re.I(忽略大小写),re.L(依赖于语言环境),re.M(多行),re.S(点匹配所有),re.U(取决于Unicode),以及re.X(详细),用于整个正则表达式。 (标志在模块内容中描述。)如果您希望将标志包含在正则表达式中,而不是将标志参数传递给compile()函数,这将非常有用。
请注意,(?x)标志会更改表达式的解析方式。它应该首先在表达式字符串中使用,或者在一个或多个空格字符之后使用。如果标志前面有非空白字符,则结果未定义。
答案 1 :(得分:3)
我不会尝试存储已编译的正则表达式。已编译的正则表达式中的数据不是为存储而设计的,并且不保证可以选择或可序列化。只需存储字符串并重新编译(无论如何,re模块将在幕后为您执行此操作)。
答案 2 :(得分:2)
您可以按照上面的建议存储文本,也可以对已编译的RE进行pickle和unpickle。例如,请参阅食谱上的PickledProperty。
由于Pickle(缺乏)速度,特别是在cPickle不可用的App Engine上,您可能会发现存储正则表达式的文本是更快的选择。事实上,似乎在腌制时,无论如何都只是存储原始文本。