在多次调用的函数内编译正则表达式
如果你在一个函数里面编写了正则表达式(regex),而这个函数被调用了很多次,Python会每次都重新编译这个正则表达式吗?还是说Python会把编译好的正则表达式缓存起来(假设这个正则表达式没有改变)?
举个例子:
def contains_text_of_interest(line):
r = re.compile(r"foo\dbar\d")
return r.match(line)
def parse_file(fname):
for line in open(fname):
if contains_text_of_interest(line):
# Do something interesting
5 个回答
2
你为什么不把 re.compile 放在函数外面(在模块或类的层级),给它起个明确的名字,然后直接使用呢?这种正则表达式可以看作是一种常量,你可以像对待常量一样来使用它。
MATCH_FOO_BAR = re.compile(r"foo\dbar\d")
def contains_text_of_interest(line):
return MATCH_FOO_BAR.match(line)
6
如果你想避免每次都调用 re.compile() 这个函数带来的额外开销,可以这样做:
def contains_text_of_interest(line, r = re.compile(r"foo\dbar\d")):
return r.match(line)
16
其实,如果你看看re模块里的代码,re.compile这个函数和其他函数一样也会使用缓存。所以,重复编译同样的正则表达式其实是非常便宜的(就像查字典一样)。换句话说,写代码的时候要尽量让它易于理解、好维护或者表达清晰,不用担心编译正则表达式会带来的额外开销。