Если вы ищете в Интернете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), последнее обновление впервые: