Пожалуйста, не используйте re.compile снова! ! !

Python регулярное выражение

Если вы ищете в ИнтернетеPython 正则表达式, вы увидите много ненужных статей, в которых написан такой код:

import re

pattern = re.compile('正则表达式')
text = '一段字符串'
result = pattern.findall(text)

На авторов этих статей могли повлиять вредные привычки в других языках, или они могли быть введены в заблуждение другими ненужными статьями и использовали их, не задумываясь.

В Python действительно нет необходимости использовать re.compile!

Чтобы продемонстрировать это, давайте посмотрим на исходный код Python.

Введите в PyCharm:

import re

re.search

Пользователи Windows затем, удерживая нажатой клавишу Ctrl на клавиатуре, щелкают левой кнопкой мыши.searchПользователи Mac удерживают клавишу команд на клавиатуре и нажмите левую кнопку мышиsearch, PyCharm автоматически перейдет к модулю re Python. Здесь вы увидите наши обычные методы регулярных выражений, будь тоfindallвсе ещеsearchвсе ещеsubвсе ещеmatch, все написано так:

_compile(pattern, flag).对应的方法(string)

Например:

def findall(pattern, string, flags=0):
    """Return a list of all non-overlapping matches in the string.

    If one or more capturing groups are present in the pattern, return
    a list of groups; this will be a list of tuples if the pattern
    has more than one group.

    Empty matches are included in the result."""
    return _compile(pattern, flags).findall(string)

Как показано ниже:

Тогда мы увидимcompile:

def compile(pattern, flags=0):
    "Compile a regular expression pattern, returning a Pattern object."
    return _compile(pattern, flags)

Как показано ниже:

Видите проблему?

Методы регулярных выражений, которые мы обычно используем, уже встроены.compile!

Нет необходимости делать это первымre.compileЗатем вызовите метод регулярного выражения.

Тут кто-то может возразить:

Если у меня есть миллион строк и я использую регулярное выражение для сопоставления, то я могу написать такой код:

texts = [包含一百万个字符串的列表]
pattern = re.compile('正则表达式')
for text in texts:
    pattern.search(text)

В настоящее время,re.compileОн выполняется только один раз, и если вы напишете такой код:

texts = [包含一百万个字符串的列表]
for text in texts:
    re.search('正则表达式', text)

Эквивалентно тому, что вы выполняете одно и то же регулярное выражение миллион раз под капотомre.compile.

Talk is cheap, show me the code.

Посмотрим на исходный код, регулярные выраженияre.compileназывается_compile, пойдем посмотрим_compileИсходный код , как показано на следующем рисунке:

Код в красной рамке, иллюстрирующий_compileПоставляется с кешем. Он автоматически сохранит до 512 ключей, состоящих из типа (шаблона), шаблона, флагов. Пока это одно и то же регулярное выражение и один и тот же флаг, когда _compile вызывается дважды, кеш будет считываться напрямую во второй раз. .

Таким образом, пожалуйста, не звоните вручнуюre.compileНу, это дурная привычка, перенесенная из других языков (да, я про Java).

Если эта статья была вам полезна, обратите внимание на мой публичный аккаунт WeChat: Unwen Code (ID: itskingname), последнее обновление впервые: