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