是否应该使用正则表达式的Pythonic“标准”?
我通常做的是在我的模块顶部执行一堆 re.compile 语句并将对象存储在全局变量中......然后在我的函数和类中使用它们。
我可以在我将使用它们的函数中定义正则表达式,但是每次都会重新编译它们。
或者,我可以完全放弃re.compile,但如果我多次使用相同的正则表达式,似乎重新编译会产生不必要的开销。
答案 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)
我个人使用你的第一种方法,我将重用的表达式在早期编译并可全局用于需要它们的函数/方法。根据我的经验,这是可靠的,并减少了他们的总编译时间。