如何在Google App Engine数据存储中存储正则表达式?
正则表达式通常是用字符串来表示的,但它们还有一些属性,比如单行、多行和忽略大小写等。那我们该怎么存储这些属性呢?还有,对于已经编译好的正则表达式,又该如何存储呢?
请注意,我们可以编写自定义属性类:http://googleappengine.blogspot.com/2009/07/writing-custom-property-classes.html
因为我对Python不太了解,我第一次尝试写一个存储编译正则表达式的自定义属性时失败了。
3 个回答
我建议不要尝试保存编译后的正则表达式。编译后的正则表达式里的数据并不是为了存储而设计的,而且也不能保证它能被序列化或者保存。你只需要保存正则表达式的字符串,然后再重新编译一下(其实在后台,re模块会自动帮你处理这个过程)。
我不确定Python是否支持这个,不过在.net的正则表达式中,你可以在正则表达式内部指定这些选项:
(?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)这个标志会改变表达式的解析方式。它应该放在表达式字符串的最前面,或者在一个或多个空白字符之后。如果在这个标志之前有非空白字符,结果就不确定了。
你可以选择像上面提到的那样存储文本,或者把编译好的正则表达式进行“腌制”(也就是用一种方式保存起来),然后再“解腌”。比如,可以看看这个链接里的内容:PickledProperty。
由于“腌制”这个过程在速度上比较慢,特别是在App Engine上,因为那里的cPickle不可用,所以你会发现存储正则表达式的文本会更快。实际上,经过“腌制”后,正则表达式似乎只是简单地保存了原始文本而已。