Помимо различий в производительности, использование re.compile и использование скомпилированного объекта регулярного выражения для сопоставления (независимо от операций, связанных с регулярным выражением) делает семантику более понятной для среды выполнения Python.
У меня был некоторый болезненный опыт отладки простого кода:
compare = lambda s, p: re.match(p, s)
и позже я бы использовал сравнение в
[x for x in data if compare(patternPhrases, x[columnIndex])]
где patternPhrases
- переменная, содержащая строку регулярного выражения, x[columnIndex]
- переменная, содержащая строку.
У меня была проблема с тем, что patternPhrases
не соответствует ожидаемой строке!
Но если бы я использовал форму re.compile:
compare = lambda s, p: p.match(s)
затем в
[x for x in data if compare(patternPhrases, x[columnIndex])]
Python жаловался бы, что "строка не имеет атрибута соответствия", так как при позиционном отображении аргумента в compare
, x[columnIndex]
используется как регулярное выражение !, когда я на самом деле имел в виду
compare = lambda p, s: p.match(s)
В моем случае использование re.compile более очевидно для цели регулярного выражения, когда его значение скрыто невооруженным глазом, поэтому я мог бы получить дополнительную помощь от проверки во время выполнения Python.
Итак, мораль моего урока заключается в том, что когда регулярное выражение - это не просто буквальная строка, я должен использовать re.compile, чтобы Python помог мне подтвердить мое предположение.