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