Хорошее решение Динго [править: объяснение Неда Батчелдера еще лучше], но вот еще одно, которое, на мой взгляд, изящно: используйте замыкания!Если это звучит как "большое слово" для вас, не волнуйтесь.Концепция проста:
def make_matching_function():
matcher = re.compile(r"foo\dbar\d")
def f(line):
return matcher.match(line)
return f
contains_text_of_interest = make_matching_function()
make_matching_function
вызывается только один раз, и поэтому регулярное выражение компилируется только один раз.Функция f
, назначенная contains_text_of_interest
, знает о скомпилированном регулярном выражении matcher
, потому что она находится в окружающей области видимости, и всегда будет знать об этом, даже если вы используете contains_text_of_interest
где-то еще (это замыкания: codeэто берет на себя все вокруг).
Конечно, не самое питонское решение этой проблемы.Но это хорошая идиома, когда ты в рукаве, когда настало время:)