Python正则表达式样式

时间:2010-07-06 16:07:02

标签: python regex

是否应该使用正则表达式的Pythonic“标准”?

我通常做的是在我的模块顶部执行一堆 re.compile 语句并将对象存储在全局变量中......然后在我的函数和类中使用它们。

我可以在我将使用它们的函数中定义正则表达式,但是每次都会重新编译它们。

或者,我可以完全放弃re.compile,但如果我多次使用相同的正则表达式,似乎重新编译会产生不必要的开销。

3 个答案:

答案 0 :(得分:6)

更简洁的一种方法是使用字典:

PATTERNS = {'pattern1': re.compile('foo.*baz'),
            'snake': re.compile('python'),
            'knight': re.compile('[Aa]rthur|[Bb]edevere|[Ll]auncelot')}

这将解决您的污染命名空间问题,而且对于任何查看代码的人来说,很明显是PATTERNS是什么用途,并且它将满足全局变量的CAPS约定。此外,您可以轻松调用re.match(PATTERNS[pattern]),或者您的逻辑调用。

答案 1 :(得分:4)

我也倾向于使用你的第一种方法,但我从未对此进行过基准测试。有一点需要注意,from the documentation是:

  

最新模式的编译版本传递给re.match(),re.search()或   re.compile()被缓存,因此一次只使用几个正则表达式的程序   不必担心编译正则表达式。

一个担心是你可能有正常的表达式没有被使用。如果在模块加载时编译所有表达式,则可能会产生编译表达式的成本,但从未从“优化”中获益。除非你编译从未使用的正常表达式的批次,否则我认为这不重要。

我建议的一件事是使用re.VERBOSE(或re.X)标记并包含注释和空格,以使除了最简单的正则表达式之外的任何内容更具可读性。

答案 2 :(得分:1)

我个人使用你的第一种方法,我将重用的表达式在早期编译并可全局用于需要它们的函数/方法。根据我的经验,这是可靠的,并减少了他们的总编译时间。