2010-07-06 86 views
2

是否存在Pythonic应该如何使用正则表达式的“标准”?Python的正则表达式风格

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

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

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

回答

6

的一种方式,这将是一个更加简洁使用的字典:

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

这将解决您的有污染的命名空间的问题,再加上这是很明显,任何人都希望你的代码是什么格局现在是,将来用于,它满足全局变量的CAPS约定。另外,您可以轻松地拨打re.match(PATTERNS[pattern]),或根据您的逻辑要求调用。

+0

我很喜欢这个!谢谢! – 2010-07-06 16:48:23

1

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

4

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

通过最近模式的编译版本re.match(),re.search()或 re.compile()的缓存,所以程序,一次只能使用几个正则表达式 不用担心编译正则表达式。

一个令人担忧的是,你可能有没有被使用的正则表达式。如果您在模块加载时编译所有表达式,则可能会产生编译表达式的代价,但从未从该“优化”中受益。我不认为这会很重要,除非你编译批次的正则表达式永远不会被使用。

我建议的一件事是使用re.VERBOSE(或re.X)标志并包含注释和空格,以使超出最普通正则表达式的任何内容更具可读性。

+0

我不喜欢我的第一种方法的原因是因为它堵塞了命名空间,并且实际的代码与运行它的代码没有关联。我希望有一种方法可以使代码更易于阅读。 – 2010-07-06 16:23:22

+0

如果您想让代码更易于阅读,请勿使用正则表达式。当然,如果你使用了很多正则表达式,这可能会使你的代码复杂化。 – 2010-07-06 16:25:58

+1

避免堵塞命名空间的一种方法是在模块变量之前放置一个或两个下划线,以避免导出变量或破坏其名称。 – 2010-07-06 16:33:09