在多次调用的函数内编译正则表达式

14 投票
5 回答
1935 浏览
提问于 2025-04-16 02:26

如果你在一个函数里面编写了正则表达式(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这个函数和其他函数一样也会使用缓存。所以,重复编译同样的正则表达式其实是非常便宜的(就像查字典一样)。换句话说,写代码的时候要尽量让它易于理解、好维护或者表达清晰,不用担心编译正则表达式会带来的额外开销。

撰写回答