Содержание

Python Regular re.compile. — Русские Блоги

Сначала мы видим инструкции о компиляции в официальном документе:

[python] view plain copy

  1. re.compile(pattern, flags=0)  
  2. Compile a regular expression pattern into a regular expression object, which can be used for matching using its match() and search() methods, described below.The expression’s behaviour can be modified by specifying a flags value. Values can be any of the following variables, combined using bitwise OR (the | operator).  

[python] view plain copy

  1. </pre><pre name=»code» class=»python»>The sequence:  
  2. prog = re.compile(pattern)  
  3. result = prog.match(string)  
  4. <strong><span style=»font-size:24px;»>is equivalent to</span></strong>  
  5. result = re.match(pattern, string)  
  6. but using re.compile() and saving the resulting regular expression object for reuse is more efficient when the expression will be used several times in a single program.
      
  7.   
  8. Note:The compiled versions of the most recent patterns passed to re.compile() and the module-level matching functions are cached, so programs that use only a few regular expressions at a time needn’t worry about compiling regular expressions.  

Вот описание флага Dotall:

[python] view plain copy

  1. re.DOTALL  
  2. Make the ‘.’ special character match any character at all, including a newline; without this flag, ‘.’ will match anything except a newline. 

Давайте возьмем каштан, чтобы объяснить:

[python] view plain copy

  1. >>> import re  
  2. >>> s = «adfad asdfasdf asdfas asdfawef asd adsfas »  
  3.   
  4. >>> reObj1 = re.compile(‘((\w+)\s+\w+)’)  
  5. >>> reObj1.findall(s)  
  6. [(‘adfad asdfasdf’, ‘adfad’), (‘asdfas asdfawef’, ‘asdfas’), (‘asd adsfas’, ‘asd’)]  
  7.   
  8. >>> reObj2 = re. compile(‘(\w+)\s+\w+’)  
  9. >>> reObj2.findall(s)  
  10. [‘adfad’, ‘asdfas’, ‘asd’]  
  11.   
  12. >>> reObj3 = re.compile(‘\w+\s+\w+’)  
  13. >>> reObj3.findall(s)  
  14. [‘adfad asdfasdf’, ‘asdfas asdfawef’, ‘asd adsfas’]  

Код ссылаясь на следующий рисунок:


Для кода выше, мы видим:

Функция Findall вернулась в список списка списка всех результатов совпадения в строке в строке, которая в основном обсуждается в списке «Результаты» в списке, что является информацией, содержащейся в списке в Findall.

1. Когда данное регулярное выражение снабжено множественным скобками, элементы списка являются кортежи, состоящие из нескольких строк, и символы в кортеже, являются одинаковыми, как скобки, а содержимое строки находятся в каждой скобки. Регулярное выражение соответствует Порядок разряда — это порядок, в котором скобки.

2. Когда скобки, приведенные в регулярном выражении, элемент списка представляет собой строку, а содержание этой строки соответствует регулярному выражению в скобках (не совпадение всего регулярного выражения).

3. Когда данное регулярное выражение не является скобками, элемент списка представляет собой строку, и эта строка — это содержание всего регулярного выражения.

《《《《《《《《《《《《《《《《《

Для данных после .re.comPile.findall (данные) мы можем сделать его строкой с помощью функции Offset index или str.join (), что позволяет легко обрабатывать, ниже python3.5 str .join () документов:

[python] view plain copy

  1. str.join(iterable)  
  2. Return a string which is the concatenation of the strings in the iterable iterable. A TypeError will be raised if there are any non-string values in iterable, including bytes objects.The separator between elements is the string providing this method. 


Интеллектуальная рекомендация

[Ytu] _2475 (C ++ Упражняет множественное наследство)

Описание Укажите класс учителей и класс Cadre (Cadres) и используйте множественные методы наследования, чтобы получить новый класс Class Teacher_cadre (учитель и кадра).

Требовать: (1) Участники данны…

Сеть обнаружения Android — это нормальный код!

В разработке Android, если приложение необходимо подключиться к сетевому запросу, то лучше всего выяснить, следует ли определить, является ли сеть в Интернете. Сеть продолжит выполнять запрос, если в …

Понять структуру данных

Программа = структура данных + алгоритм основная концепция Данные: опишите символ объективных вещей, является объектом, который можно управлять на компьютере, может быть идентифицирован компьютером и …

Глава 8 «Как работает Tomcat»: загрузчик классов

Основное содержание этой главы разделено на три части: первая часть рассказывает о «модели делегирования» jvm, вторая и третья части — это класс WebappLoader и класс WebappClassLoader. Мод…

Ява фонд

Во-первых, основной тип 1. Основные типы и виды упаковки 2. Основное введение Java не использует ключевое слово new для основных типов данных, но напрямую хранит переменные в стеке, что более эффектив. ..

Вам также может понравиться

Сопоставление метода настройки суперпараметров

  В машинном обучении вы всегда будете сталкиваться с такими скучными и трудоемкими вещами, как настройка параметров. К счастью, существует множество библиотек и соответствующих методов, которые …

Springboot + Springsecurity + Keycloak Integration

Недавние проекты команды Доступ к KeyCloak Unified управляемые пользователи, а также аутентификацию входа в систему, и аутентификация независимо реализована каждым проектом. 1. Настройте клиент в KeyC…

ListView

<1> Введение ListView — часто используемый компонент в разработке для Android. Он отображает определенный контент в виде списка и может отображаться адаптивно в зависимости от длины данных. Для …

Безопасность Android [Базовые знания]

Android lifecycle:   Android system file introduce: Activity lifecycle: App system file introduce: 1. Архитектура Android Уровень приложений Android: apk Уровень платформы Android: DEX Уровень ви. ..

Структура таблицы виртуальной функции C ++

Оригинальный анализ таблиц виртуальной функции C ++ Различные объекты одного класса имеют одну и ту же виртуальную функциональную таблицу. Любая функция указателя выводит непосредственно от Cout до 1,…

Регулярные выражения в Python (regex find match groups replace string)

Содержание страницы

Регулярное выражение (Regular Expression, RegEx) — это мощный, гибкий и эффективный инструмент для сопоставления текста на основе заранее определенного шаблона. Т.е. регулярные выражения позволяют найти строки или наборы строк в тексте, используя специализированный синтаксис, с помощью которого описывается шаблон для поиска. Универсальные шаблоны регулярных выражений напоминают миниатюрный язык программирования, который предназначен для описания и разбора текста.

Почему регулярные выражения?

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

Вот несколько сценариев для работы с RegEx в Python:

  1. Data Mining: регулярное выражение — лучший инструмент для интеллектуального анализа данных. Он эффективно идентифицирует текст (строку, подстроку) в куче текста, проверяя его по заранее заданному шаблону. Некоторые распространенные сценарии — определение адреса электронной почты, URL-адреса или телефона из кучи текста.
  2. Data Validation (Проверка данных):
    регулярное выражение может идеально подойти для таких задач, как проверка данных. Он может включать в себя широкий спектр процессов проверки путем определения различных наборов шаблонов. Вот несколько примеров: проверка номеров телефонов, электронной почты и т.д.

Модуль Re (import re) — операции с регулярными выражениями

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

Этот модуль предоставляет операции сопоставления регулярных выражений в Python, аналогичные тем, которые имеются в Perl. Основная функция модуля re — предложить поиск, в котором используются регулярное выражение и строка. Здесь он либо возвращает первое совпадение, либо ничего. Модуль re вызывает исключение re.error, если ошибка возникает при компиляции или использовании регулярного выражения.

Команда для импорта модуля re:

import re

Краткое описание синтаксиса RegEx на примере с Email

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

Пример регулярного выражения для проверки email с пометкой каждого компонента:

Еще один пример с почтой:

Описание некоторых общих компонентов регулярных выражений:

  • Символ + в регулярном выражении означает «сопоставить предыдущий символ один или несколько раз».
    Например, 
    ab+c соответствует «abc», «abbc», «abbbc», но не соответствует «ac» . Знак плюс, используемый в регулярном выражении, называется Клини плюс в честь математика Стивена Клини (1909–1994), который ввел эту концепцию.
  • Символ * в регулярном выражении означает «сопоставить предыдущий символ ноль или более раз». Например, ab*c соответствует «abc», «abbc», «abbbc» и «ac». Это называется звездой Клини.
  • Знак вопроса ? указывает на 
    0 или 1
    вхождение предыдущего элемента. Например, colou?r соответствует как «color», так и «colour».
  • Точка соответствует любому одиночному символу (кроме символа новой строки). Например, a.c соответствует «abc», «adc», «aec» и т.д. Если мы хотим сопоставить несколько символов перед буквой «c», мы бы просто использовали звездочку * следующим образом: a.*c и это будет соответствовать «a bdefgh .
  • [a-z]: очень полезно, так как определяет диапазон возможных значений — относится ко всем строчным буквам алфавита от a до z. [hc]at соответствует  «hat» и «cat», но только в начале строки.
  • \ Backspace экранирует точку, поэтому наше регулярное выражение не считает, что это часть наших квантификаторов, как определено выше. Нам нужно, чтобы точка была буквально частью нашего шаблона, поскольку она находится в нашем поисковом шаблоне.

RegEx в Python

Регулярные выражения — это, по сути, крошечный узкоспециализированный язык программирования, встроенный в Python и доступный через модуль re.

Используя этот небольшой язык, вы указываете правила для набора возможных строк, которые вы хотите сопоставить:

  • этот набор может содержать английские предложения,
  • или адреса электронной почты,
  • или команды TeX,
  • и т.д.

Затем вам необходимо задать такие вопросы, как «Соответствует ли эта строка шаблону?» или «Есть ли где-нибудь в этой строке совпадение с шаблоном?».

Модель RE также можно использовать для изменения строки или разделения ее на части различными способами.

Шаблоны регулярных выражений компилируются в серию байт-кодов, которые затем выполняются механизмом сопоставления, написанным на C определенным образом для создания байт-кода, который работает быстрее.

Язык регулярных выражений относительно мал и ограничен, поэтому не все возможные задачи обработки строк можно выполнить с помощью регулярных выражений. Есть также задачи, которые можно решить с помощью регулярных выражений, но выражения получаются очень сложными. В этих случаях вам может быть лучше написать код Python для обработки; в то время как код Python будет медленнее, чем сложное регулярное выражение, он также, вероятно, будет более понятным.

Вводный пример RegEx на Python

Когда вы импортировали re модуль, вы можете начать использовать регулярные выражения:

Пример — Проверим строку, что она начинается с ‘The’ и заканчивается ‘Spain’:

import re
#Check if the string starts with "The" and ends with "Spain":
txt = "The rain in Spain"
x = re. The.*Spain$", txt)
if x:
  print("YES! We have a match!")
else:
  print("No match")

Результат:

YES! We have a match!

Функции RegEx

Регулярные выражения компилируются в объекты шаблонов, которые имеют методы для различных операций, таких как поиск совпадений с шаблоном или выполнение подстановки строк.

Модуль re предоставляет набор функций/методов, которые позволяют нам искать строку по совпадению:

  • findall() — Возвращает список, содержащий все совпадения
  • search() — Возвращает объект Match, если где-либо в строке есть совпадение
  • split() — Возвращает список, в котором строка была разделена при каждом совпадении
  • sub() — Заменяет одно или несколько совпадений строкой
  • subn() — Делает то же самое, что и sub(), но возвращает новую строку и количество замен
  • match() — Ищет совпадение с начала строки
  • finditer() — Ищет все совпадения с pattern, возвращает итератор
  • compile() — Компилирует regular expression, на выходе получаем объект, к которому затем можно применять все перечисленные функции
  • fullmatch() — Проверяет, что вся строка соответствует описанному регулярному выражению
  • flags (флаги) — Указываются в функциях, влияют на поведение регулярного выражения

Metacharacters (Метасимволы)

Метасимволы — это символы со специальным значением:

Meta CharacterОписание
[…]Набор символов
[^…]Отрицательный класс символов.Начинается с
$Заканчивается на
*Ноль или более случаев
+Одно или несколько случаев
?Ноль или одно вхождение
{}Ровно указанное количество вхождений
{n,m}Соответствует не менее «n», но не более «m» повторений предыдущего символа.
|Чередование. Соответствует символам до или после символа |
()Захват и группировка
(xyz)Группа символов. Соответствует символам xyz именно в этом порядке.

Special Sequences RegEx (Специальные последовательности)

Специальная последовательность — это когда за символом \ следует один из символов в списке ниже, которая имеет особое значение:

CharacterОписание
\AВозвращает совпадение, если указанные символы находятся в начале строки
\bВозвращает совпадение, в котором указанные символы находятся в начале или в конце слова
\BВозвращает совпадение, в котором указанные символы присутствуют, но НЕ в начале (или в конце) слова
\dВозвращает совпадение, в котором строка содержит цифры (числа от 0 до 9)
\DВозвращает совпадение, в котором строка НЕ ​​содержит цифр
\sВозвращает совпадение, в котором строка содержит символ пробела
\SВозвращает совпадение, в котором строка НЕ ​​содержит пробела
\wВозвращает совпадение, в котором строка содержит любые символы слова (символы от a до Z, цифры от 0 до 9 и символ подчеркивания _ )
\WВозвращает совпадение, в котором строка НЕ ​​содержит символов слова
\ZВозвращает совпадение, если указанные символы находятся в конце строки

Sets (Наборы)

Set (Набор) — это набор символов внутри пары квадратных скобок [] со специальным значением:

SetОписание
[arn]Возвращает совпадение, в котором присутствует один из указанных символов (a, r или n)
[a-n]Возвращает совпадение для любого символа нижнего регистра в алфавитном порядке от a до n
[^arn]Возвращает совпадение для любого символа, ЗА ИСКЛЮЧЕНИЕМ a, r и n
[0123]Возвращает совпадение, в котором присутствует любая из указанных цифр (0, 1, 2 или 3)
[0-9]Возвращает совпадение для любой цифры от 0 до 9
[0-5][0-9]Возвращает совпадение для любых двузначных чисел от 00 до 59
[a-zA-Z]Возвращает соответствие для любого символа в алфавитном порядке от a до z, в нижнем регистре ИЛИ в верхнем регистре
[+]В наборах + * . | () $ {} знак не имеет особого значения, поэтому [+] означает: вернуть совпадение для любого символа + в строке

Символ \ — бэкслеш в Python RegEx

Регулярные выражения используют символ обратной косой черты (‘\’) для обозначения специальных форм или для разрешения использования специальных символов без обращения к их особому значению. Это противоречит тому, что Python использует тот же символ для той же цели в строковых литералах.

Допустим, вы хотите написать RE, который соответствует строке \section, которая может быть найдена в файле. Чтобы понять, что писать в программном коде, начните с нужной строки для сопоставления. Затем вы должны экранировать обратную косую черту и другие метасимволы, предваряя их обратной косой чертой, в результате чего получится строка \\section.

Результирующая строка, которую необходимо передать, re.compile() должна быть \\section. Однако, чтобы выразить это как строковый литерал Python, обе обратные косые черты должны быть снова экранированы.

СимволыЭтап
\sectionТекстовая строка для сопоставления
\\sectionЭкранированная обратная косая черта для re.compile()
"\\\\section"Экранированные символы обратной косой черты для строкового литерала

Решение состоит в том, чтобы использовать для регулярных выражений нотацию необработанных строк Python. Обратная косая черта не обрабатывается каким-либо особым образом в строковом литерале с префиксом ‘r’:

r"\\section"

Регулярные выражения часто записываются в коде Python с использованием этой записи необработанных строк:

Regular StringRaw string
"ab*"r"ab*"
"\\\\section"r"\\section"
"\\w+\\s+\\1"r"\w+\s+\1"

Проверка и тестирование регулярных выражений

  • https://regex101. com/ — интерактивная консоль регулярных выражений, которая позволяет отлаживать выражения в режиме реального времени. Это означает, что вы можете создавать свои выражения и одновременно видеть, как они влияют на набор данных в реальном времени на одном экране. Инструмент был создан Фирасом Дибом при участии многих других разработчиков. Это крупнейший сервис тестирования регулярных выражений в мире.
  • http://www.pyregex.com/ — онлайн-тестер регулярных выражений для проверки правильности регулярных выражений в подмножестве регулярных выражений языка Python.
  • https://pythex.org/ — Pythex is a real-time regular expression editor for Python, a quick way to test your regular expressions.

Функция findall()

Определение функции

Функция findall() возвращает список, содержащий все совпадения.

Модуль findall() используется для поиска «всех» вхождений, соответствующих заданному шаблону. Напротив, модуль search() вернет только первое вхождение, соответствующее указанному шаблону. findall() перебирает все строки файла и возвращает все непересекающиеся совпадения шаблона за один шаг.

Синтаксис

re.findall(pattern, string, flags=0)

Пример использования

Функция search()

Определение функции

Функция search() будет искать шаблон регулярного выражения и возвращать первое вхождение. В отличие от Python match(), он проверяет все строки входной строки. Функция Python search() возвращает объект соответствия, когда шаблон найден, и «ноль», если шаблон не найден.

Синтаксис

re.search(pattern, string, flags=0)

Пример использования

туду

Функция split()

Определение функции

Функция split() работает аналогично методу split в строках, но в функции re. split можно использовать регулярные выражения, а значит, разделять строку на части по более сложным условиям.

Синтаксис

re.split(pattern, string, maxsplit=0, flags=0)

Пример использования

туду

Функция sub()

Определение функции

Функция re.sub работает аналогично методу replace в строках. Но в функции re.sub можно использовать регулярные выражения, а значит, делать замены по более сложным условиям.

Синтаксис

re.sub(pattern, repl, string, count=0, flags=0)

Пример использования

туду

Функция subn()

Определение функции

Функция subn() аналогична sub(), но возвращает новую строку и количество произведенных замен.

Синтаксис

re.subn(pattern, repl, string, count=0, flags=0)

Пример использования

туду

Функция match()

Определение функции

Функция re. match() re в Python будет искать шаблон регулярного выражения только в начале строки. Функция match() возвращает объект соответствия, если часть начала строки подпадает под шаблон, иначе функция вернет None.

Синтаксис

re.match(pattern, string, flags=0)

Пример использования

туду

Функция fullmatch()

Определение функции

Функция re.fullmatch() вернет объект сопоставления, если вся исходная строка соответствует шаблону Regular Expression.

Синтаксис

re.fullmatch(pattern, string, flags=0)

Пример использования

туду

Функция compile()

Определение функции

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

Использование компилированного выражения может ускорить обработку, и, как правило, такой вариант удобней использовать, так как в программе разделяется создание регулярного выражения и его использование. Кроме того, при использовании функции re.compile создается объект RegexObject, у которого есть несколько дополнительных возможностей, которых нет в объекте MatchObject.

Синтаксис

re.compile(pattern, flags=0)

Пример использования

туду

Функция finditer()

Определение функции

Метод finditer() используется для поиска всех непересекающихся совпадений в шаблоне и возвращает итератор с объектами Match (finditer возвращает итератор даже в том случае, когда совпадение не найдено). Функция finditer отлично подходит для обработки тех команд, вывод которых отображается столбцами.

Синтаксис

re. finditer(pattern, string, flags=0)

Пример использования

туду

Match Object

Определение

Match Object — это объект, содержащий информацию о поиске и результате.

Объект Match имеет свойства и методы, используемые для получения информации о поиске и результате:

  • .span() возвращает кортеж, содержащий начальную и конечную позиции совпадения.
  • .string возвращает строку, переданную в функцию,
  • .group() возвращает часть строки, в которой произошло совпадение

Flags (флаги)

Определение Flags

туду

туду

Не бойтесь регулярных выражений. Regex за 20 минут!

Python для Начинающих — Регулярные Выражения

Часть 1

Часть 2

Python с нуля. Регулярные выражения

Часть 1

Часть 2

Python 3. Регулярные выражения — плейлист

Ссылка на плейлист >>>

5 1 голос

Рейтинг статьи

теория и практика для новичков и не только

Что такое Regex

Регулярные выражения (Regex) – это строки, задающие шаблон для поиска определенных фрагментов в тексте. Помимо поиска, с помощью специальных Regex-шаблонов можно манипулировать текстовыми фрагментами – удалять и изменять подстроки частично или полностью. -\w&=%])’Используя метасимволы, можно создавать сложные шаблоны, содержащие специальные конструкции для работы с определенными последовательностями и группами символов.

Regex-выражения применяют для обработки текстовых данных, в том числе в скриптах для веб-скрапинга. Кроме того, Regex используют в составе OCR-приложений для очистки отсканированного текста.

Regex в Python

Большинство современных языков программирования поддерживают регулярные выражения, однако степень удобства использования Regex в разных языках варьируется. Python предоставляет простые и понятные методы для работы с регулярными выражениями. Все Regex инструменты находятся в модуле re, который входит в стандартный дистрибутив Python – достаточно импортировать его в свой проект:

import re

Для экранирования служебных символов в шаблонах поиска и замены используют два способа – обратный слэш \ и «сырые» строки r''. Второй метод предпочтительнее – он позволяет избежать нагромождения слэшей в шаблонах.

Основные функции Regex

re.match() – находит вхождение фрагмента в начале строки. Обычный формат использования – re.match(r'шаблон', строка):

import re
s = "утка крякает, кукушка кукует, петух кукарекает"
match = re.match(r'ку', s)
print(match)

    

Этот код вернет None, несмотря на то, что в строке есть 5 фрагментов «ку». Это происходит потому, что оба фрагмента расположены не в начале строки.

re.search() – находит первое вхождение фрагмента в любом месте и возвращает объект match. Если в строке есть другие фрагменты, соответствующие запросу, re.search их проигнорирует. У re.search есть дополнительные методы:

.span() – возвращает кортеж, содержащий начальную и конечную позиции искомого фрагмента.

.string – вернет строку, переданную в функцию re.search.

.group() – возвращает фрагмент строки, в котором было обнаружено совпадение.

#Пример использования re.search с дополнительными методами
import re
s = "oт топота копыт пыль по полю летит"
match = re.search(r'по', s)
print(match, match.span(), match.string, match.group(), sep='\n')

    
#Вывод:
<re.Match object; span=(5, 7), match='по'>
(5, 7)
oт топота копыт пыль по полю летит
по

    

re.findall() – находит все вхождения фрагмента, в любом месте. Функция re.findall() учитывает регистр символов. Чтобы в результат вошли фрагменты с символами в другом регистре, применяют флаг re.IGNORECASE:

import re
s = "Не видно, ликвидны акции или неликвидны."
match = re.findall(r'не', s, re.I)
print(match)

    

re. split() – расщепляет строку по заданному шаблону. Количество расщеплений задается флагом – в этом примере от строки отделяется только первое слово:

import re
s = "Обладаешь ли ты налогооблагаемой благодатью?"
res = re.split(r' ', s, 1)
print(res) 

    

re.sub() – заменяет фрагмент в соответствии с шаблоном:

import re
s = "Коала какао лениво лакала"
res = re.sub(r'коала', 'макака', s, flags=re.I)
print(res)

    

re.compile() – создает объект из регулярного выражения. Применяется, если один и тот же поисковый шаблон используется в коде несколько раз:

import re
st = re.compile('угнал')
res1 = st.findall("Карл у Клары угнал Maclaren, а Клара у Карла угнала Corvette.")
res2 = st.findall("Карл у Клары угнал кораллы, а Клара у Карла угнала кларнет.")
print(res1, res2, sep='\n')

    

Все перечисленные выше примеры предназначены для выполнения самых простых задач по поиску и замене фрагментов текста. Возможности Regex в Python намного шире: шаблоны могут включать условия, учитывать (или игнорировать) группы символов и диапазоны значений. Для создания таких регулярных выражений используют специальные конструкции, состоящие из метасимволов.

Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека питониста»

Интересно, перейти к каналу

Основные метасимволы в Regex

[] – используется для указания набора или диапазона символов – re.findall(r'[с-я]', "Камер-юнкер юркнул в бункер", re.I), re.findall(r'[аж]', "ажиотаж, мандраж, багаж").

\ – указывает на начало последовательности (мы рассмотрим их ниже) или экранирует служебные символы.

. – выбирает любой символ, кроме новой строки \n.

^ – проверяет, начинается ли строка с определенного символа / слова / набора символов. в наборе [] имеет другое значение – проверяет, отсутствуют ли в строке определенные символы (подробнее об этом ниже).

$ – проверяет, заканчивается ли строка в соответствии с шаблоном r'До свиданья.$'.

* – ноль или больше совпадений с шаблоном r'ко.*аборация'.

+ – одно и более совпадений r'к.+ператив'.

? – ноль или одно совпадение r'ф.?нтастика'. Кроме того, нейтрализует «жадность» выражений, которые используют ., *, + для выбора любых символов.

{} – точное число совпадений r'Интерсте.{2}ар'.

| – любой из двух вариантов r'уйду|останусь'.

() – захватывает группу для дальнейших манипуляций – re.sub(r'(www)', r'\1.', "wwwwear-gear.com").

<> – создает именованную группу – re.search('(?P<группа1>\w+),(?P<группа2>\w+),(?P<группа3>\w+)', 'дом,улица,фонарь')

Последовательности

Знаком слэша \ обозначается специфическая последовательность символов.

\A – проверяет, начинается ли строка с определенной последовательности символов. Например, re.findall(r"\AДом", txt), проверит, начинается ли предложение со слова «Дом».

\b – возвращает совпадение, если слово начинается или заканчивается нужной последовательностью символов. Выражение re. findall(r".com\b", s) проверит, есть ли в строке хотя бы одно доменное имя зоны .com.

\B – возвращает совпадение, если определенные символы есть в строке, но не в начале или не в конце слова – re.findall(r"\Bро", 'розовая от мороза'), re.findall(r'ин\B', 'синий апельсин').

\d – проверяет, что в строке есть цифры от 0 до 9 – re.findall("\d", 'при пожаре звоните 112').

\D – удостоверяет, что цифр в строке нет – re.findall("\D", 'цифр нет').

\s – проверяет наличие пробелов в строке – re.findall("\s", "один пробел").

\S – возвращает совпадение, если в строке есть любые символы, кроме пробелов – re. findall("\S", "непустая строка").

\w – проверяет, есть ли в строке «словесные» символы – знак нижнего подчеркивания, цифры и буквы – re.findall(r"\w", "_\\\\").

\W – возвращает совпадение по каждому «несловесному» символу – re.findall("\W", "здесь есть такие символы!").

\Z – проверит, заканчивается ли строка нужной последовательностью символов – re.findall("конец\Z", "это конец").

Наборы и диапазоны символов

Наборы и диапазоны в регулярных выражениях заключены в квадратные скобки:

[есн] – проверит, есть ли в строке любой из указанных символов е, с или нre.findall("[есн]", "здесь есть несколько символов из набора"). абвгд]», «АБВГДейка – детская передача», re.I).

[0-5][0-9] – возвращает совпадения по двузначным цифрам от 00 до 59re.findall("[0-5][0-9]", "будильник сработает в 07:45").

Флаги в Regex

Функциональность регулярных выражений расширяется за счет флагов:

Краткий синтаксисПолный синтаксисНазначение
re.Are.ASCIIВозвращает совпадения только по ASCII-символам вместо всей таблицы Unicode.
re.Ire.IGNORECASEИгнорирует регистр символов.
re.Mre. и $. В первом случае возвращает совпадения в начале каждой новой строки \n, во втором – в конце \n.
re.Sre.DOTALLЗаставляет метасимвол . возвращать совпадения по абсолютно всем символам, включая \n. Без этого флага точка . соответствует любому символу, кроме \n.
re.Xre.VERBOSEРазрешает комментарии в Regex-выражениях.
re.Lre.LOCALEУчитывает региональные настройки при использовании \w, \W, \b, \B, \s и \S. Используется только при работе с байтовыми строками, не совместим с re.ASCII.

Онлайн-конструкторы регулярных выражений

Чем сложнее регулярное выражение, тем труднее его правильно составить и протестировать. В интернете есть немало визуализаторов Regex, которые значительно упрощают эту задачу. Самый удобный ресурс – regex101. Сайт предоставляет справочную и отладочную информацию, позволяет визуально тестировать шаблоны для поиска и замены. Помимо Python, поддерживает PHP, Java, Golang и JavaScript.

Конструктор Regex

Примеры использования регулярных выражений в Python

Задача 1:

Написать регулярное выражение для извлечения из текста всех email-адресов.

Решение:

import re
s = 'По всем вопросам пишите на [email protected], или на [email protected], отвечу сразу. Или пишите моему ассистенту [email protected]!'
emails = re.findall(r'[\w\.-]+@[\w\.-]+', s)
for email in emails:
    print(email)

    

Задача 2:

Имеется файл transactions. txt, в котором даты указаны в формате MM/DD/YYYY, при этом в некоторых случаях месяц обозначен первыми тремя буквами: NOV, dec, JAN. Нужно привести даты к формату MM-DD-YYYY.

#формат дат в файле transactions.txt
nov/14/2021
dec/15/2021
12/16/2021
dec/17/2021
jan/03/2022
JAN/10/22

    

Решение:

import fileinput
import re
fn = "transactions.txt" 
for line in fileinput.input(fn, inplace=True):
    new_line = re.sub('(\d{2}|[a-yA-Y]{3})\/(\d{2})\/(\d{2, 4})', r'\1-\2-\3', line)
    print(new_line)

    
#Содержимое файла после выполнения кода:
nov-14-2021
dec-15-2021
12-16-2021
dec-17-2021
jan-03-2022
JAN-10-2022

    

Задача 3:

Вводится последовательность строк. Нужно вывести строки, в которых фрагмент «кот» присутствует в качестве подстроки не менее 2 раз.

#Пример ввода
кот-кот
кот и кот
котофей
котейка кот
кот и котенок

    

Решение:

import re
import sys
for line in sys.stdin:
    line = line.strip()
    if re.search(r"кот.*?кот", line):
        print(line)

    

Задача 4:

Дана последовательность строк. Нужно вывести те, в которых «кот» встречается в качестве отдельного слова.

#Пример ввода:
кот в сапогах
кошка и кот
котофей
котяра

    

Решение:

import re
import sys
for line in sys.stdin:
    line = line.rstrip()
    if re.search(r"\bкот\b", line):
        print(line)

    
#Вывод
кот в сапогах
кошка и кот

    

Задача 5:

Вывести слова, состоящие из двух одинаковых слогов.

#Пример ввода
тартар
тик-так
сносно
варвар
барабан

    

Решение:

import re
import sys
for line in sys.stdin:
    line = line.strip()
    if re.search(r"\b(\w+)\1\b", line):
        print(line)

    
#Вывод
тартар
сносно
варвар

    

Задача 6:

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

#Пример ввода
это пример текста
в котором нужно поменять буквы

    

Решение:

import sys
import re
for line in sys.stdin:
    line = line.rstrip()
    print(re.sub(r'\b(\w)(\w)', r"\2\1", line))

    
#Вывод
тэо рпимер еткста
в октором унжно опменять убквы

    

Задача 7:

Напишите функцию для валидации мобильного номера в международном формате. Корректным считается представление номера в таком виде:

+7(912)15-16-896, 8(912)15-16-896
+79121516896, 89121516896
+7(912)151-68-96, 8(912)151-68-96
+7912-151-6896, 87912-151-6896

    

Решение:

import re
pattern = re.compile(r'(\+7|8).*?(\d{2,3}).*?(\d{2,3}).*?(\d{2}).*?(\d{2})')
def isValid(number):
    if re.match(pattern, number):
        print("ДА")
    else:
        print("НЕТ")
isValid(input())

    

Задача 8:

Напишите программу для парсинга номеров телефонов с тестовой страницы.

Решение:

import urllib.request
from re import findall
url = "http://www.summet.com/dmsi/html/codesamples/addresses.html"
response = urllib.request.urlopen(url)
data = response.read()
s = data.decode()
phones = findall("\(\d{3}\) \d{3}-\d{4}", s)
for number in phones:
    print(number)

    

Задача 9:

Нужно извлечь все имена и фамилии из текста.

Решение:

import re
s = 'На встрече присутствовали: профессор Владимир Успенский, физик-ядерщик Сергей Ковалев, президент клуба Владимир Медведев и космонавт Юрий Титов.'
name = r"[А-Я][а-я]+,?\s+"
last_name = r"[А-Я][а-я]+"
persons = re.findall(name + last_name, s)
for item in persons:
    print(item)

    

Задача 10:

Нужно получить URL всех png и jpg изображений, использованных на главной странице proglib.io:

import re
import requests
def getURL(text):
    urls = []
    results = re.findall(r'(?:http\:|https\:)?\/\/.*\.(?:png|jpg)', text)
    for x in results:
        if not x.startswith('http:'):
            x = 'http:' + x
            urls.append(x)
    return urls
def getImages(url):
    resp = requests.get(url)
    urls = getURL(resp.text)
    print('urls', urls)
getImages('https://proglib. io')

    

Заключение

Regex в Python – мощный, гибкий, но достаточно сложный инструмент. Регулярные выражения сложно составлять, поддерживать и редактировать. При работе с текстовыми файлами Regex чаще всего можно заменить методами строк, а при парсинге, в большинстве случаев, использование XPath и CSS-селекторов окажется более эффективным.

***

Карточки

Регулярные выражения в PythonОсновные функции RegexОсновные функции Regex в PythonОсновные метасимволы Regex в PythonПоследовательности Regex в PythonПоследовательности Regex в Python

***

Материалы по теме

  • Регулярные выражения: 5 сервисов для тестирования и отладки
  • Практическое введение в регулярные выражения для новичков
  • Регулярные выражения: базовое знакомство для новичков

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

Регулярные выражения – это небольшой язык, который вы можете использовать внутри Python и многих других языках программирования. Зачастую регулярные выражения упоминаются как “regex”, “regexp” или просто “RE”, от reuglar expressions. Такие языки как Perl и Ruby фактически поддерживают синтаксис регулярных выражений прямо в собственном языке. Python же поддерживает благодаря библиотеки, которую вам нужно импортировать. Основное использование регулярных выражений – это сопоставление строк. Вы создаете правила сопоставления строк, используя регулярные выражения, после чего вы применяете их в строке, чтобы увидеть, присутствуют ли какие-либо сопоставления. «Язык» регулярных выражений на самом деле весьма короткий, так что вы вряд ли сможете использовать для всех своих нужд при сопоставлении строк. Кроме того, работая с задачами, в которых вы используете регулярные выражения, вы можете заметно усложнить процесс, а лечение багов в таком случае очень трудоемкое. В таких случаях вам нужно просто использовать Python.

Обратите внимание на то, что Python – идеальный язык для парсинга текстов согласно его правам, и его можно использовать во всем, что вы делаете с регулярными выражениями. Однако, на это может потребоваться много кода, который будет работать медленнее, чем это делают регулярные выражения, так как они скомпилированы и выполнены в С.

Согласуемые символы

Когда вам нужно найти символ в строке, в большей части случаев вы можете просто использовать этот символ или строку. Так что, когда нам нужно проверить наличие слова «dog», то мы будем использовать буквы в dog. Конечно, существуют определенные символы, которые заняты регулярными выражениями. Они так же известны как метасимволы. Внизу изложен полный список метасимволов, которые поддерживают регулярные выражения Python:

Python

. ˆ $ * + ? { } [ ] | ( )

. ˆ $ * + ? { } [ ] | ( )

Давайте взглянем как они работают. Основная связка метасимволов, с которой вы будете сталкиваться, это квадратные скобки: [ и ]. Они используются для создания «класса символов», который является набором символов, которые вы можете сопоставить. Вы можете отсортировать символы индивидуально, например, так: [xyz]. Это сопоставит любой внесенный в скобки символ. Вы также можете использовать тире для выражения ряда символов, соответственно: [a-g]. В этом примере мы сопоставим одну из букв в ряде между a и g. Фактически для выполнения поиска нам нужно добавить начальный искомый символ и конечный. Чтобы упростить это, мы можем использовать звездочку. Вместо сопоставления *, данный символ указывает регулярному выражению, что предыдущий символ может быть сопоставлен 0 или более раз. Давайте посмотрим на пример, чтобы лучше понять о чем речь:

Python

‘a[b-f]*f

‘a[b-f]*f

Этот шаблон регулярного выражения показывает, что мы ищем букву а, ноль или несколько букв из нашего класса, [b-f] и поиск должен закончиться на f. Давайте используем это выражение в Python:

Python

import re text = ‘abcdfghijk’ parser = re. search(‘a[b-f]*f’) print(parser.group()) # ‘abcdf’

import re

text = ‘abcdfghijk’

 

parser = re.search(‘a[b-f]*f’)

print(parser.group()) # ‘abcdf’

В общем, это выражение просмотрит всю переданную ей строку, в данном случае это abcdfghijk.
Выражение найдет нашу букву «а» в начале поиска. Затем, в связи с тем, что она имеет класс символа со звездочкой в конце, выражение прочитает остальную часть строки, что бы посмотреть, сопоставима ли она. Если нет, то выражение будет пропускать по одному символу, пытаясь найти совпадения. Вся магия начинается, когда мы вызываем поисковую функцию модуля re. Если мы не найдем совпадение, тогда мы получим None. В противном случае, мы получим объект Match. Чтобы увидеть, как выглядит совпадение, вам нужно вызывать метод group. Существует еще один повторяемый метасимвол, аналогичный *. также используется как анкор, который обычно используется для совпадений в начале строки.

Существует соответствующий якорь для конце строки – «$». Мы потратим много времени на введение в различные концепты применения регулярных выражений. В следующих параграфах мы углубимся в более подробные примеры кодов.

Поиск сопоставлений шаблонов

Давайте уделим немного времени тому, чтобы научиться основам сопоставлений шаблонов. Используя Python для поиска шаблона в строке, вы можете использовать функцию поиска также, как мы делали это в предыдущем разделе этой статьи. Вот пример:

Python

import re text = «The ants go marching one by one» strings = [‘the’, ‘one’] for string in strings: match = re.search(string, text) if match: print(‘Found «{}» in «{}»‘.format(string, text)) text_pos = match.span() print(text[match.start():match.end()]) else: print(‘Did not find «{}»‘. format(string))

1

2

3

4

5

6

7

8

9

10

11

12

13

14

import re

 

text = «The ants go marching one by one»

 

strings = [‘the’, ‘one’]

 

for string in strings:

    match = re.search(string, text)

    if match:

        print(‘Found «{}» in «{}»‘.format(string, text))

        text_pos = match.span()

        print(text[match.start():match.end()])

    else:

        print(‘Did not find «{}»‘.format(string))

В этом примере мы импортируем модуль re и создаем простую строку. Когда мы создаем список из двух строк, которые мы будем искать в главной строке. Далее мы делаем цикл над строками, которые хотим найти и запускаем для них поиск. Если есть совпадения, мы выводим их. В противном случае, мы говорим пользователю, что искомая строка не была найдена.

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Python Форум Помощи

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Подписаться

Существует несколько других функций, которые нужно прояснить в данном примере. Обратите внимание на то, что мы вызываем span. Это дает нам начальную и конечную позицию совпавшей строки. Если вы выведите text_pos, которому мы назначили span, вы получите кортеж на подобие следующего: (21, 24). В качестве альтернативы вы можете просто вызвать методы сопоставления, что мы и сделаем далее. Мы используем начало и конец для того, чтобы взять начальную и конечную позицию сопоставления, это должны быть два числа, которые мы получаем из span.

Коды поиска

Существует несколько специальных выражений, которые вы можете искать, используя Python. Вот короткий список с кратким пояснением каждого кода:

  • \d соответствует цифре
  • \D соответствует не цифре
  • \s соответствует пустому полю (пробел)
  • \S соответствует заполненному полю
  • \w соответствует алфавитно-цифровому значению
  • \W соответствует не алфавитно-цифровому значению

Вы можете использовать эти коды внутри класса символа вот так: [\d]. Таким образом, это позволит нам найти любую цифру, находящейся в пределе от 0 до 9. Я настаиваю на том, чтобы вы попробовали остальные коды выхода лично.

Компилирование

Модуль re позволяет вам «компилировать» выражение, которое вы ищите чаще всего. Это также позволит вам превратить выражение в объект SRE_Pattern. Вы можете использовать этот объект в вашей функции поиска в будущем. Давайте используем код из предыдущего примера и изменим его, чтобы использовать компилирование:

Python

import re text = «The ants go marching one by one» strings = [‘the’, ‘one’] for string in strings: regex = re.compile(string) match = re.search(regex, text) if match: print(‘Found «{}» in «{}»‘.format(string, text)) text_pos = match.span() print(text[match.start():match.end()]) else: print(‘Did not find «{}»‘.format(string))

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

import re

 

text = «The ants go marching one by one»

 

strings = [‘the’, ‘one’]

 

for string in strings:

    regex = re. compile(string)

    match = re.search(regex, text)

    if match:

        print(‘Found «{}» in «{}»‘.format(string, text))

        text_pos = match.span()

        print(text[match.start():match.end()])

    else:

        print(‘Did not find «{}»‘.format(string))

Обратите внимание на то, что здесь мы создаем объект паттерна, вызывая compile в каждой строке нашего списка, и назначаем результат переменной – регулярному выражению. Далее мы передаем это выражение нашей поисковой функции. Остальная часть кода остается неизменной. Основная причина, по которой используют компилирование это сохранить выражение для повторного использования в вашем коде в будущем. В любом случае, компилирование также принимает флаги, которые могут быть использованы для активации различных специальных функций. Мы рассмотрим это далее.
Обратите внимание: когда вы компилируете паттерны, они автоматически кэшируются, так что если вы не особо используете регулярные выражения в своем коде, тогда вам не обязательно сохранять компилированный объект как переменную.

Флаги компиляции

Существует 7 флагов компиляции, которые содержатся в Python 3. Эти флаги могут изменить поведение вашего паттерна. Давайте пройдемся по каждому из них, затем рассмотрим, как их использовать.

re.A / re.ASCII

Флаг ASCII указывает Python сопоставлять против ASCII, вместо использования полного Юникода для сопоставления, в сочетании со следующими кодами: w, W, b, B, d, D, s и S. Также существует флаг re.U / re.UNICODE, который используется в целях обратной совместимости. В любом случае, эти флаги являются излишеством, так как Python выполняет сопоставления в Юникоде в автоматическом режиме.

re.DEBUG

Данный флаг показывает информацию о дебаге вашего скомпилированного выражения.

re.I / re.IGNORECASE

Если вам нужно выполнить сравнение без учета регистра, тогда этот флаг – то, что вам нужно. Если ваше выражение было [a-z] и вы скомпилировали его при помощи этого флага, то ваш паттерн сопоставит заглавные буквы в том числе.  для начала строки, и начало каждой линии. Он также указывает Python, что $ должен сопоставить конец каждой строки и конец каждой линии, что не сильно отличается от их значений по умолчанию. Вы можете обратиться к документации для дополнительной информации.

re.S / re.DOTALL

Этот забавный флаг указывает метасимволу «.» (период) сопоставить любой символ. Без этого флага, данный метасимвол будет сопоставлять все, что угодно, но не новую строку.

re.X / re.VERBOSE

Если вы считаете, что ваши регулярные выражения не слишком читабельные, тогда данный флаг – это то, что вам нужно. Он позволяет визуально разделять логические секции ваших регулярных выражений, и даже добавлять комментарии! Пустое пространство внутри паттерна будет игнорироваться, кроме того случая, если классу символа или пробелу предшествует обратная косая черта.

Использование флага компиляции

Давайте уделим немного времени, и посмотрим на простой пример, в котором используется флаг компиляции VERBOSE. Неплохой пример – взять обычную электронную почту и использовать поиск регулярных выражений, таких как r’[w.-]+@[w.-]+’ и добавить комментарии, используя флаг VERBOSE. Давайте посмотрим:

Python

re.compile(»’ [\w\.-]+ @ [\w\.-]+’ »’, re.VERBOSE)

1

2

3

4

5

6

re.compile(»’

           [\w\.-]+

           @

           [\w\.-]+’

           »’,

           re.VERBOSE)

Давайте пройдем дальше и научимся находить множественные совпадения.

Находим множественные совпадения

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

Python

import re silly_string = «the cat in the hat» pattern = «the» match = re. search(pattern, text) print(match.group()) # ‘the’

1

2

3

4

5

6

7

import re

 

silly_string = «the cat in the hat»

pattern = «the»

 

match = re.search(pattern, text)

print(match.group()) # ‘the’

Теперь, как вы видите, у нас есть два экземпляра слова the, но нашли мы только одно. Существует два метода, чтобы найти все совпадения. Первый, который мы рассмотрим, это использование функции findall:

Python

import re silly_string = «the cat in the hat» pattern = «the» a = re.findall(pattern, silly_string) print(a) # [‘the’, ‘the’]

1

2

3

4

5

6

7

import re

 

silly_string = «the cat in the hat»

pattern = «the»

 

a = re.findall(pattern, silly_string)

print(a) # [‘the’, ‘the’]

Функция findall будет искать по всей переданной ей строке, и впишет каждое совпадение в список. По окончанию поиска вышей строки, она выдаст список совпадений. Второй способ найти несколько совпадений, это использовать функцию finditer:

Python

import re silly_string = «the cat in the hat» pattern = «the» for match in re.finditer(pattern, silly_string): s = «Found ‘{group}’ at {begin}:{end}».format( group=match.group(), begin=match.start(), end=match.end()) print(s)

1

2

3

4

5

6

7

8

9

10

11

import re

 

silly_string = «the cat in the hat»

pattern = «the»

 

for match in re.finditer(pattern, silly_string):

    s = «Found ‘{group}’ at {begin}:{end}».format(

        group=match.group(), begin=match.start(),

        end=match.end())

    

    print(s)

Как вы могли догадаться, метод finditer возвращает итератор экземпляров Match, вместо строк, которые мы получаем от findall. Так что нам нужно немного подформатировать результаты перед их выводом. Попробуйте запустить данный код и посмотрите, как он работает.

Сложности с обратными косыми

Обратные косые немного усложняют жизнь в мире регулярных выражений Python. Это связанно с тем, что регулярные выражения используют обратные косые для определения специальных форм, или для того, чтобы искать определенный символ, вместо того, чтобы вызывать его. Как если бы мы искали символ доллара $. Если мы не используем обратную косую для этого, нам нужно просто создать анкор. Проблема возникает по той причине, что Python использует символ обратной косой по той же причине в литеральных строках.

Давайте представим, что вам нужно найти строку на подобии этой: «python». Для её поиска в регулярном выражении, вам нужно будет использовать обратную косую, но, так как Python также использует обратную косую, так что на выходе вы получите следующий поисковый паттерн: «\\python» (без скобок). К счастью, Python поддерживает сырые строки, путем подстановки буквы r перед строкой. Так что мы можем сделать выдачу более читабельной, введя следующее: r”\python”. Так что если вам нужно найти что-то с обратной косой в названии, убедитесь, что используете сырые строки для этой цели, иначе можете получить совсем не то, что ищете.

Подведем итоги

В данной статье мы коснулись только вершины айсберга, под названием регулярные выражения. Существуют целые книги, посвященные регулярным выражениям, однако эта статья, по крайней мере, дает вам базовое представление для начала. Теперь вы можете искать углубленные примеры и обратиться к документации, скорее всего не один и не два раза, пока вы учитесь. Но помните о том, что регулярные выражения – очень удобный и полезный инструмент.

Vasile Buldumac

Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.

E-mail: [email protected]

Образование
Universitatea Tehnică a Moldovei (utm.md)

  • 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
  • 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»

Python Compile Regex Pattern – re.compile()

Метод Python re.compile() используется для компиляции шаблона регулярного выражения, предоставленного в виде строки, в объект шаблона регулярного выражения ( re.Pattern ). Позже мы можем использовать этот объект шаблона для поиска совпадений внутри разных целевых строк, используя методы регулярных выражений, такие как re. match() или re.search() .

Проще говоря, мы можем скомпилировать регулярное выражение в объект регулярного выражения, чтобы искать вхождения одного и того же шаблона в различных целевых строках без перезаписи.

Содержание

  • Как использовать метод re.compile()
    • Пример компиляции регулярного выражения
  • Зачем и когда использовать re.compile()
    • Стоит ли использовать метод re.( )?

Как использовать

re.compile () Метод

Синтаксис re.compile ()

 re.compile (шаблон, флаги = 0) 
  1. Работ : шаблон регулярного выражения в строковом формате, который вы пытаетесь сопоставить внутри целевой строки.
  2. флаги : поведение выражения можно изменить, указав значения флагов регулярного выражения. Это необязательный параметр

Есть много значений флагов, которые мы можем использовать. Например, re.I используется для выполнения сопоставления без учета регистра. Мы также можем комбинировать несколько флагов, используя ИЛИ (оператор | ).

Возвращаемое значение

Метод re.compile() возвращает объект шаблона (т.е. re.Pattern ).

Как скомпилировать шаблон регулярного выражения

  1. Записать шаблон регулярного выражения в строковом формате

    Записать шаблон регулярного выражения, используя необработанную строку. Например, шаблон для соответствия любой цифре.
    str_pattern = r'\d'

  2. Передать шаблон методу compile()

    pattern = re.compile(r'\d{3})
    Компилирует шаблон регулярного выражения строку в объект шаблона регулярного выражения.

  3. Использовать объект Pattern для сопоставления с шаблоном регулярного выражения

    Использовать объект Pattern, возвращаемый методом compile(), для сопоставления с шаблоном регулярного выражения.
    res = pattern.findall(target_string)

Пример компиляции регулярного выражения

Теперь давайте посмотрим, как использовать re.compile() на простом примере.

Шаблон для компиляции:  r'\d{3}'

Что означает этот шаблон?

  • Прежде всего, я использовал необработанную строку для указания шаблона регулярного выражения.
  • Далее, \d  – это специальная последовательность, которая соответствует любой цифре от 0 до 9 в целевой строке.
  • Тогда 3 внутри фигурных скобок означает, что цифра должна встречаться ровно три раза подряд внутри целевой строки.

Проще говоря, это означает, что соответствует любым трем последовательным цифрам внутри целевой строки, например 236, 452 или 782.

Пример :

 импорт повторно
# Целевая строка один
str1 = "Числа удачи Эммы: 251 761 231 451"
# шаблон для поиска трех последовательных цифр
string_pattern = г"\d{3}"
# скомпилировать строковый шаблон в объект re.Pattern
regex_pattern = перекомпилировать (string_pattern)
# вывести тип скомпилированного паттерна
печать (тип (regex_pattern))
# Вывод <класс 're.Pattern'>
# найти все совпадения в первой строке
результат = regex_pattern.findall (str1)
печать (результат)
# Вывод ['251', '761', '231', '451']
# Целевая строка два
str2 = "Числа удачи Келли: 111 212 415"
# найти все совпадения во второй строке, повторно используя тот же шаблон
результат = regex_pattern.findall (str2)
печать (результат)
# Вывод ['111', '212', '415'] 

Как видите, мы нашли четыре совпадения «трех последовательных» цифр внутри первой строки.

Примечание:

  • Метод re.compile() изменил шаблон строки на объект re.Pattern , с которым мы можем работать.
  • Затем мы использовали объект re.Pattern внутри метода re.findall() для получения всех возможных совпадений любых трех последовательных цифр внутри целевой строки.
  • Теперь тот же объект reagex_pattern можно использовать аналогичным образом для поиска трех последовательных цифр и в других целевых строках.

Зачем и когда использовать re.compile()

Повышение производительности

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

Имейте в виду, что метод compile() полезен для первоначального определения и создания объекта регулярных выражений, а затем, используя этот объект, мы можем искать вхождения одного и того же шаблона в различных целевых строках без перезаписи, что экономит время и повышает производительность.

Удобочитаемость

Еще одним преимуществом является удобочитаемость. Используя re.compile() , вы можете отделить определение регулярного выражения от его использования.

Например:

 pattern= re.compile("str_pattern")
результат = pattern.match(string) 

эквивалентен

 result = re.match("str_pattern", string) 

Избегайте использования метода compile() , если вы хотите искать различные шаблоны внутри одной целевой строки. Вам не нужно использовать метод compile заранее, потому что компиляция выполняется автоматически с выполнением других методов регулярного выражения.

Стоит ли использовать Python

re.compile() ?

Как вы знаете, Python всегда внутренне компилирует и кэширует регулярные выражения всякий раз, когда вы их используете (включая вызовы search() или match()), поэтому, используя метод compile(), вы изменяетесь только тогда, когда регулярное выражение компилируется.

Но компиляция регулярного выражения полезна в следующих ситуациях.

  • Указывает на то, что скомпилированные регулярные выражения будут часто использоваться и их нельзя удалять.
  • Скомпилировав один раз и повторно используя одно и то же регулярное выражение несколько раз, мы уменьшаем вероятность опечаток.
  • Когда вы используете множество различных регулярных выражений, вы должны сохранить скомпилированные выражения для тех, которые используются несколько раз, чтобы они не сбрасывались из кеша регулярных выражений, когда кеш заполнен.

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

Итак, в заключение , Да, вы должны использовать метод compile() , когда вы собираетесь выполнять много совпадений, используя один и тот же шаблон. Кроме того, когда вы ищете один и тот же шаблон снова и снова и в нескольких целевых строках

Предыдущий :

Python Regex

Следующая :

Match Match: Guide for Satternating

Python REGEX Match —

Method Method

Python re.match () Method Method . ищет шаблон регулярного выражения только в начале целевой строки и возвращает объект соответствия , если совпадение найдено; в противном случае он вернет None.

В этой статье вы узнаете, как сопоставить шаблон регулярного выражения внутри целевой строки, используя match() , методы search() и findall() модуля re .

Метод re.match() начнет сопоставление шаблона регулярного выражения с самого первого символа текста, и если совпадение будет найдено, он вернет объект re.Match . Позже мы можем использовать объект re.Match для извлечения совпадающей строки.

Прочитав эту статью, вы сможете выполнять следующие операции сопоставления шаблонов регулярных выражений в Python.

Operation Meaning
re.match(pattern, str) Matches  pattern  only at the beginning of the string
re.search(pattern, str ) Соответствует шаблону  в любом месте строки. Возвращает только первое совпадение
re.search(pattern $ , str) Dollar ( $ ) совпадений 9 ) и re.M  флаг для соответствия шаблону  в начале каждой новой строки строки
re.fullmatch(pattern, str) вся целевая строка соответствует шаблону .
Операции сопоставления регулярных выражений Python

Содержание

  • Как использовать re. match()
    • Синтаксис re.match()
    • Возвращаемое значение
  • Совпадение с шаблоном регулярного выражения в начале строки
  • Совпадение с шаблоном регулярного выражения в любом месте строки
  • Совпадение с регулярным выражением в конце строки
  • Совпадение с точным словом или строкой
  • Понимание объекта Match
  • Совпадение с начальным шаблоном регулярного выражения и заканчивается заданным текстом
  • Больше операций сопоставления
  • Поиск регулярных выражений по сравнению с совпадением
    • Поведение поиска по сопоставлению с многострочной строкой
  • re.fullmatch()
  • Зачем и когда использовать re.match() и re.fullmatch()

Как использовать re.match()

Прежде чем двигаться дальше, давайте посмотрим на синтаксис re.match()

Синтаксис re.match()
 re.match(шаблон, строка, флаги=0) 

Шаблон регулярного выражения и целевая строка являются обязательными аргументами, а флаги необязательны.

  1. шаблон : шаблон регулярного выражения, которому мы хотим соответствовать в начале целевой строки. Поскольку мы не определяем и не компилируем этот шаблон заранее (как метод компиляции). Практика заключается в том, чтобы написать фактический шаблон, используя необработанная строка .
  2. строка : Второй аргумент — это переменная, указывающая на целевую строку (в которой мы хотим искать вхождения шаблона).
  3. flags : Наконец, третий аргумент является необязательным и относится к флагам регулярных выражений, по умолчанию флаги не применяются.
    Мы можем использовать множество значений флагов. Например, re.I используется для выполнения поиска без учета регистра. Мы также можем комбинировать несколько флагов, используя побитовое ИЛИ ( | оператор ).

Возвращаемое значение

Если ноль или более символов в начале строки соответствуют шаблону регулярного выражения, возвращается соответствующий экземпляр объекта соответствия, т. е. объект re.Match . Объект соответствия содержит местоположения, в которых совпадение начинается и заканчивается, а также фактическое значение совпадения.

Если ему не удается найти вхождения шаблона, который мы хотим найти, или такой шаблон не существует в целевой строке, он вернет Нет введите

Теперь давайте посмотрим, как использовать re.match() .

Совпадение с шаблоном регулярного выражения в начале строки

Теперь давайте посмотрим на пример, чтобы найти любое четырехбуквенное слово в начале строки. (Проверьте, начинается ли строка с заданного шаблона).

Шаблон для сопоставления: \w{4}

Что означает этот шаблон?

  • \w — это специальная последовательность регулярных выражений, которая представляет любой буквенно-цифровой символ, означающий буквы (прописные или строчные), цифры и символ подчеркивания.
  • Затем 4 внутри фигурных скобок говорят, что символ должен встречаться ровно четыре раза подряд (четыре последовательных символа).

Проще говоря, это означает, что соответствует любому четырехбуквенному слову в начале следующей строки.

 target_string = "Эмма — баскетболистка, родившаяся 17 июня 1993 года" 

Как видно из приведенной выше строки Эмма — это четырехбуквенное слово, присутствующее в начале целевой строки, поэтому мы должны получить Эмму в качестве вывода.

 импорт повторно
target_string = "Эмма — баскетболистка, родившаяся 17 июня"
результат = re.match(r"\w{4}", target_string) #
# печать объекта Match
print("Совпадение с объектом: ", результат)
# Вывод объекта re.Match; span=(0, 4), match='Эмма'
# Извлечь значение совпадения
print("Значение соответствия: ", result.group())
# Вывод 'Emma' 

Как видите, сопоставление начинается с индекса 0 и заканчивается до индекса 4, потому что метод re.match() всегда выполняет сопоставление с шаблоном в начале целевой строки.

Давайте разберем приведенный выше пример

  • Я использовал необработанную строку для указания шаблона регулярного выражения. Как вы, возможно, уже знаете, в некоторых случаях обратная косая черта имеет особое значение, потому что она может указывать на escape-символ или escape-последовательность, чтобы избежать использования необработанной строки.
  • Затем мы написали шаблон регулярного выражения для соответствия любому слову из четырех букв.
  • Затем мы передали этот шаблон методу match() для поиска шаблона в начале строки.
  • Затем он нашел совпадение и вернул нам объект re.Match .
  • В конце концов, мы использовали метод group() объекта Match для получения точного значения совпадения, т. е. Эммы.

Соответствие шаблону регулярного выражения в любом месте строки

Предположим, вы хотите сопоставить любое слово из шести букв внутри следующей целевой строки

 target_string = "Джесса любит Python и панд" 

Если вы используете метод match() для сопоставьте любое шестибуквенное слово внутри строки, вы получите None, потому что он возвращает совпадение только в том случае, если шаблон расположен в начале строки. И, как мы видим, шестибуквенного слова в начале нет.

Таким образом, чтобы сопоставить шаблон регулярного выражения в любом месте строки, вам нужно использовать метод search() или findall() модуля RE.

Давайте посмотрим демо.

Пример соответствия шестибуквенному слову в любом месте строки

 import re
target_string = "Джесса любит Python и панд"
# Соответствие шестибуквенному слову
шаблон = г"\ш{6}"
# метод match()
результат = re.match (шаблон, целевая_строка)
печать (результат)
# Вывод Нет
# метод поиска()
результат = re.search (шаблон, целевая_строка)
печать (результат.группа())
# Вывод 'Питон'
# метод findall()
результат = re.findall (шаблон, целевая_строка)
печать (результат)
# Вывод ['Python', 'панды'] 

Соответствие регулярному выражению в конце строки

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

Используя метасимвол доллара ( $ ) , мы можем сопоставить шаблон регулярного выражения в конце строки.

Пример сопоставления четырехзначного числа в конце строки

 import re
target_string = "Эмма — баскетболистка, родившаяся 17 июня 19 года.93"
# совпадение в конце
результат = re.search(r"\d{4}$", target_string)
print("Соответствующий номер: ", result.group())
# Выходные данные 1993 

Совпадение с точным словом или строкой

В этом разделе мы увидим, как написать шаблон регулярного выражения для совпадения с точным словом или подстрокой внутри целевой строки. Давайте посмотрим на пример соответствия слову « player » в целевой строке.

Пример :

 импорт повторно
target_string = "Эмма — баскетболистка, родившаяся 17 июня"
результат = re.findall(r"игрок", target_string)
print("Соответствует строковому литералу: ", результат)
# Вывод ['игрок'] 

Понимание объекта Match

Как вы знаете, методы match() и search() возвращают объект re. Match , если совпадение найдено. Давайте посмотрим на структуру объекта r e.Match .

 объект re.Match; span=(0, 4), match='Emma' 

Этот объект re.Match содержит следующие элементы.

  1. Атрибут span , показывающий места начала и окончания совпадения. т. е. содержит ли объект кортежа начальный и конечный индексы успешного совпадения.
    Сохраните этот кортеж и используйте его всякий раз, когда вы хотите получить совпадающую строку из целевой строки
  2. Во-вторых, атрибут match содержит фактическое значение совпадения, которое мы можем получить с помощью метода group() .

Объект Match имеет несколько методов и атрибутов для получения информации о совпадающей строке. Давайте посмотрим на них.

Метод Описание
группа() Вернуть строку, соответствующую повторному росу
() Возврат начальной позиции матча
End () 191918888888888888888888 гг. span() Возвращает кортеж, содержащий (начало, конец) позиции совпадения.

Пример получения информации о совпадающей строке

 импорт повторно
target_string = "Джесса и Келли"
# Соответствие пятибуквенному слову
res = re.match(r"\b\w{5}\b", target_string)
# печать всего объекта совпадения
печать (разрешение)
# Вывод объекта re.Match; span=(0, 5), match='Джесса'
# Извлечь соответствующее значение
печать (рез.группа())
# Вывод Джесса
# Начальный индекс совпадения
печать (рез.старт())
# Выход 0
# Конечный индекс совпадения
print("Конечный индекс: ", res.end()) # 5
# Начальный и конечный индекс совпадения
позиция = res.span()
печать (поз.)
# Вывод (0, 5)
# Используйте диапазон, чтобы получить совпадающую строку
печать (целевая_строка [позиция [0]: позиция [1]])
# Вывод 'Джесса' 

Совпадение с шаблоном регулярного выражения, которое начинается и заканчивается заданным текстом

Предположим, вы хотите проверить, начинается ли данная строка и заканчивается ли она определенным текстом. Мы можем сделать это, используя следующие два метасимвола регулярных выражений с методом re.match() .

  • Использовать метасимвол вставки для соответствия в начале
  • Использовать метасимвол доллара для соответствия в конце

Теперь давайте проверим, начинается ли данная строка с буквы «p» и заканчивается буквой «t» 9(P).*(s)$', str1) если рез: печать (рез.группа()) еще: печать('Нет') str1 = "PYnative предназначен для разработчиков Python" начинается_заканчивается_с (str1) # Вывод 'PYnative предназначен для разработчиков Python' str2 = "PYnative для Python" начинается_заканчивается_с (str2) # Output None

Другие операции сопоставления

В этом разделе рассмотрим некоторые распространенные операции сопоставления регулярных выражений, такие как

  • Соответствие любому символу
  • Соответствие номеру
  • Соответствие цифрам
  • Соответствие специальным символам
 импорт
str1 = "Эмма 12 25"
# Соответствует любому символу
печать (повторное совпадение (r'. ', str1))
# вывод 'Е'
# Совпадение со всеми цифрами
print(re.findall(r'\d', str1))
# Вывод ['1', '2', '2', '5']
# Совпадение со всеми числами
# + указать 1 или более вхождений \d
print(re.findall(r'\d+', str1))
# вывод ['12', '25']
# Совпадение со всеми специальными символами и символами
str2 = "Привет, #Джесса!@#$%"
печать (re.findall (r'\W', str2))
# Вывод [' ', '#', '!', '@', '#', '$', '%'] 

Также прочитайте совпадение/захват группы регулярных выражений

Поиск по регулярным выражениям и match

В этом разделе мы поймем разницу между методами search() и match(). Вы также узнаете, когда использовать метод сопоставления и поиска при выполнении операций с регулярными выражениями.

Модуль Python RE предлагает два разных метода сопоставления шаблонов регулярных выражений.

  • Функция match() проверяет совпадение только в начале строки.
  • Функция search() проверяет совпадение в любом месте строки.

Как работает re. match()

Метод match возвращает соответствующий экземпляр объекта сопоставления, если ноль или более символов в начале строки соответствуют шаблону регулярного выражения.

Проще говоря, re.match возвращает объект соответствия, только если шаблон находится в начале строки; в противном случае он вернет None.

Как работает re.search()

С другой стороны, метод поиска сканирует всю строку в поисках шаблона и возвращает только первое совпадение. То есть, как только он получает первое совпадение, он останавливает свое выполнение.

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

Теперь давайте попробуем сопоставить любое двузначное число внутри следующей целевой строки, используя метод поиска и сопоставления.

 Эмма — бейсболистка, родившаяся 17 июня 1993 г.  

Как видите, в начале строки нет двузначного числа, поэтому метод match() должен возвращать None, а поиск метод должен возвращать совпадение.

Поскольку метод match() пытается найти совпадение только в начале и search(), попробуйте найти совпадение в любом месте строки.

 импорт
target_string = "Эмма — бейсболистка, родившаяся 17 июня 1993 года"
# Совпадение с двузначным числом
# Использование совпадения()
результат = re.match(r'\d{2}', target_string)
печать (результат)
# Вывод Нет
# Использование поиска()
результат = re.search(r'\d{2}', target_string)
печать (результат.группа())
# Выход 17
 

Поведение поиска и сопоставления с многострочной строкой 9

) метасимвол для соответствия каждому шаблону регулярного выражения в начале каждой новой строки. Но вы должны заметить, что даже в режиме MULTILINE функция match() будет соответствовать только началу строки, а не началу каждой строки.

С другой стороны, метод поиска сканирует всю многострочную строку в поисках шаблона и возвращает только первое совпадение.

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

 импорт
multi_line_string = """Эмма
люблю питона"""
# Совпадает в начале
print(re.match('emma', multi_line_string).group())
# Вывод 'эмма'
# re.match не соответствует началу каждой новой строки
# Соответствует только началу строки
# Не совпадет
print(re.match('love', multi_line_string, re.MULTILINE))
# Вывод Нет
# нашел "любовь" в начале новой строки
print(re.search('love', multi_line_string).group())
# Вывод 'любовь'
pattern = re.compile('Python$', re.MULTILINE)
# Не совпадает
печать (шаблон. матч (multi_line_string))
# Вывод Нет
# нашел 'Python' в конце
печать (шаблон. поиск (multi_line_string). группа ())
# Вывод 'Питон'
 

re.fullmatch()

В отличие от метода match(), который выполняет сопоставление с образцом только в начале строки, метод re.fullmatch возвращает объект соответствия тогда и только тогда, когда вся цель строка от первого до последнего символа соответствует шаблону регулярного выражения .

Если сопоставление выполнено успешно, будет возвращена вся строка как значение совпадения, потому что мы всегда сопоставляем всю строку в fullmatch .

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

Шаблон для соответствия: .{42}

Что означает этот шаблон?

Этот шаблон говорит, что я хочу сопоставить строку из 42 символов.

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

  • DOT — это специальный символ, соответствующий любому символу, будь то буква, цифра, пробел или символ, за исключением символа новой строки, который в Python является обратной косой чертой.
  • Далее, 42 в фигурных скобках говорит о том, что строка должна состоять из 42 символов.

Теперь давайте посмотрим на пример.

 импорт
# длина строки 42
str1 = "Меня зовут Максим и моя зарплата 1000$"
print("длина строки1: ", len(str1))
результат = re.fullmatch(r".{42}", str1)
# вывести весь объект совпадения
печать (результат)
# вывести фактическое значение совпадения
print("Соответствие: ", результат.группа()) 

Выход :

 str1 длина: 42
объект re.Match; span=(0, 42), match='Меня зовут Максим и моя зарплата 1000$'
Совпадение: Меня зовут Максим и моя зарплата 1000$ 

Как видно из вывода, мы получили объект совпадения, что означает, что совпадение было выполнено успешно.

Примечание : Если строка содержит один или несколько символов новой строки, сопоставление не удастся, поскольку специальный символ исключает новую строку. Поэтому, если бы наша целевая строка состояла из нескольких строк или абзацев, совпадение было бы неудачным. мы можем решить такие проблемы, используя атрибут flags.

Зачем и когда использовать re.match() и re.fullmatch()

  • Используйте метод re.match() , если вы хотите найти шаблон в начале строки (начиная с первого символа строки ).
  • Если вы хотите сопоставить полную строку с шаблоном, используйте re.fullmatch() . Метод re.fullmatch возвращает объект соответствия тогда и только тогда, когда вся целевая строка от первого до последнего символа соответствует шаблону регулярного выражения.

Предыдущий :

Python Regex Compile

Следующая :

Python Regex Search

Python Flags (с примерами) - Prightanative

Python REGEX REGEX позволяет опциональный флагс с оборотными для обороты. match() , search() и split() , среди прочих.

Все методы модуля RE принимают необязательный аргумент flags, который включает различные уникальные функции и варианты синтаксиса.

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

Вы узнаете, как использовать все флаги регулярных выражений, доступные в Python, на коротких и понятных примерах.

Во-первых, см. в таблице ниже доступные флаги регулярных выражений .

Флаг длинный синтаксис 9 соответствует шаблону в начале строки и в начале каждой новой строки ( \n ).
И метасимвол $ соответствует шаблону в конце строки и в конце каждой новой строки ( \n )
re.S re.DOTALL
4 . ) специальный символ соответствует любому символу вообще, включая новую строку. Без этого флага DOT( . ) будет соответствовать чему угодно, кроме новой строки
re.X re.VERBOSE Разрешить комментарий в регулярном выражении. Этот флаг полезен, чтобы сделать регулярное выражение более читабельным, разрешая комментарии в регулярном выражении.
re.L re.LOCALE Выполнять сопоставление без учета регистра в зависимости от текущей локали. Используйте только с шаблонами байтов
Флаги регулярных выражений Python

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

 re.findall(pattern, string, flags=re.I|re.M|re.X) ​​

Теперь давайте посмотрим, как использовать каждый флаг опции в регулярном выражении Python.

Table of contents

  • IGNORECASE flag
  • DOTALL flag
  • VERBOSE flag
  • MULTILINE flag
  • ASCII flag

IGNORECASE flag

First of all, let's see the re. I flag's role, which stands за игнорирование дела. указал этот флаг в методе регулярного выражения в качестве аргумента для выполнения сопоставления без учета регистра. Вы можете указать этот флаг двумя способами

  1. re.I
  2. re.IGNORECASE

Пример

 import re
target_str = "KELLy — разработчик Python в PYnative. kelly любит машинное обучение и искусственный интеллект"
# Без использования re.I
результат = re.findall(r"kelly", target_str)
печать (результат)
# Вывод ['келли']
# с ре.я
результат = re.findall(r"kelly", target_str, re.I)
печать (результат)
# Вывод ['КЕЛЛИ', 'келли']
# с re.IGNORECASE
результат = re.findall(r"kelly", target_str, re.IGNORECASE)
печать (результат)
# Вывод ['KELLy', 'kelly'] 

Обратите внимание, что слово « kelly » встречается в этой строке два раза. Во-первых, с заглавной буквы в начале предложения, а во-вторых, во всех строчных буквах.

В первом методе re. findall() мы получили только одно вхождение, потому что по умолчанию сопоставление чувствительно к регистру.

А во втором методе re.findall() мы получили 2 вхождения, потому что мы изменили поведение регулярного выражения с учетом регистра, используя re.I , чтобы он мог находить все вхождения слова независимо от его буквы в верхнем или нижнем регистре.

Флаг DOTALL

Теперь давайте посмотрим на роль флага re.S . Вы можете указать этот флаг двумя способами:

  1. re.S
  2. re.DOTALL

Как вы знаете, по умолчанию метасимвол точки ( . ) внутри шаблона регулярного выражения представляет собой любой символ. будь то буква, цифра, символ или знак препинания, за исключением символа новой строки, который равен \n .

Флаг re.S устраняет это исключение путем включения DOT( . ) метасимвол для соответствия любому возможному символу, включая символ новой строки, отсюда и его название DOTALL .

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

Теперь воспользуемся методом re.search() с флагом RE.S и без него.

Пример

 импорт
# строка с символом новой строки
target_str = "ML\nи ИИ"
# Соответствует любому символу
результат = re.search(r".+", target_str)
print("Без использования флага re.S:", result.group())
# Вывод 'ML'
# С флагом re.S
результат = re.search(r".+", target_str, re.S)
print("С флагом re.S:", result.group())
# Вывод 'ML\nи AI'
# С флагом re.DOTALL
результат = re.search(r".+", target_str, re.DOTALL)
print("С флагом re.DOTALL:", result.group())
# Вывод 'ML\nand AI' 

При первом вызове метода re.search() DOT не распознал \n и прекратил сопоставление. После добавления флага опции re.S при следующем вызове символ точки соответствовал всей строке.

Флаг VERBOSE

Этот флаг re. X означает verbose . Этот флаг обеспечивает большую гибкость и лучшее форматирование при написании более сложных шаблонов регулярных выражений между скобками match() , search() или другие методы регулярных выражений.

Вы можете указать этот флаг двумя способами

  1. re.X
  2. re.VERBOSE

Флаг verbose позволяет нам использовать следующие параметры внутри шаблона регулярного выражения чистый формат для более расширенных и сложных узоров.

  • Позволяет нам добавлять комментарии прямо внутри шаблона для дальнейшего использования с использованием знака решетки (#).
  • 9\w{2,}) # соответствует 5-буквенному слову в начале .+(\d{4}$) # соответствует 4-значному числу в конце """, target_str, re.X) # Слово из пяти букв печать (группа результатов (1)) # Вывод 'Джесса' # 4-значный номер печать (группа результатов (2)) # Выход 8000

    Multiline Flag

    Вы можете указать этот флаг, используя два способа

    1. Re. M
    2. RE.Multilin

    . Флаг Re.m . метод для выполнения совпадения внутри многострочного блока текста. 9\w{3}", target_str, re.MULTILINE) печать (результат) # Вывод ['Джой', 'Том'] # С ре.М # найти двузначное число в конце каждой новой строки результат = re.findall(r"\d{2}$", target_str, re.M) печать (результат) # Выход ['75', '25']

    Flag ASCII

    Вы можете указать этот флаг, используя Two Ways

    1. Re.A
    2. RE.ASCII

    . \W , \b , \B , \d \D , \s и \S выполняют сопоставление только ASCII вместо полного сопоставления Unicode. Это имеет смысл только для шаблонов Unicode и игнорируется для шаблонов байтов.

     импорт
    # строка с символами ASCII и Unicode
    target_str = "虎太郎 и Джесса - друзья"
    # Без re.A или re.ASCII
    # Чтобы соответствовать всем 3-буквенным словам
    результат = re. findall(r"\b\w{3}\b", target_str)
    печать (результат)
    # Вывод ['虎太郎', 'и', 'есть']
    # С re.A или re.ASCII
    # регулярное выражение для соответствия только 3-буквенному слову ASCII
    результат = re.findall(r"\b\w{3}\b", target_str, re.A)
    печать (результат)
    # Вывод ['и', 'являются'] 

    Предыдущий :

    Python Regex Special Sequences

    Следующая :

    Python Regex Metacharacters

    Python Regex Search - RE.Search ()

    Python regex Reghersearch () Eccurencies occurrences 40004. шаблон регулярного выражения внутри всей целевой строки и возвращает соответствующий экземпляр объекта соответствия, в котором найдено совпадение.

    Функция re.search() возвращает только первое совпадение с шаблоном из целевой строки. Используйте re.search() для поиска шаблона в любом месте строки.

    Содержание

    • Как использовать re.search()
    • Пример поиска с регулярным выражением – поиск слова внутри целевой строки
      • Пример поиска с регулярным выражением найти точную подстроку или слово
    • Когда использовать re. search ()
    • Поиск по сравнению с findall
    • Группы поиска регулярных выражений или несколько шаблонов
      • Поиск нескольких слов с использованием регулярных выражений
    • Поиск регулярных выражений без учета регистра

    Как использовать

    re.search()

    Прежде чем двигаться дальше, давайте посмотрим на его синтаксис.

    Синтаксис

     re.search(шаблон, строка, флаги=0) 

    Шаблон регулярного выражения и целевая строка являются обязательными аргументами, а флаги необязательны.

    • шаблон : Первый аргумент — это шаблон регулярного выражения, который мы хотим найти внутри целевой строки.
    • строка : Второй аргумент — это переменная, указывающая на целевую строку (в которой мы хотим искать вхождения шаблона).
    • флаги : Наконец, третий аргумент является необязательным и относится к флагам регулярных выражений по умолчанию флаги не применяются.

    Есть много значений флагов, которые мы можем использовать. Например, re.I используется для выполнения поиска без учета регистра. Мы также можем комбинировать несколько флагов с помощью побитового ИЛИ (оператор | ).

    Возвращаемое значение

    Метод re.search() возвращает объект Match (т. е. re.Match ). Этот объект сопоставления содержит следующие два элемента.

    1. Объект кортежа содержит начальный и конечный индексы успешного совпадения.
    2. Во-вторых, он содержит фактическое значение соответствия, которое мы можем получить с помощью метода group() .

    Если метод re.search() не может найти вхождения шаблона, который мы хотим найти, или такой шаблон не существует в целевой строке, он вернет тип None.

    Теперь давайте посмотрим, как использовать re.search() .

    Пример поиска по регулярному выражению — поиск слова внутри целевой строки

    Теперь давайте посмотрим, как использовать re. search() для поиска следующего шаблона внутри строки.

    Шаблон: \w{8}

    Что означает этот шаблон?

    • \w — это специальная последовательность регулярных выражений, которая представляет любой буквенно-цифровой символ, такой как прописные или строчные буквы, цифры, а также символ подчеркивания.
    • Тогда 8 внутри фигурных скобок означает, что символы должны встречаться ровно 8 раз подряд внутри целевой строки

    Проще говоря, это означает поиск любого восьмибуквенного слова

     "Эмма - это бейсболист, родившийся 17 июня 1993 года». 

    Как видно из приведенной выше строки baseball — это первое восьмибуквенное слово внутри целевой строки, поэтому на выходе мы должны получить бейсбольный мяч.

     импорт
    # Целевая строка
    target_string = "Эмма — бейсболистка, родившаяся 17 июня"
    # search() для слова из восьми букв
    результат = re. search(r"\w{8}", target_string)
    # Распечатать объект совпадения
    print("Совпадение с объектом", результат)
    # вывод объекта re.Match; span=(10, 18), match='бейсбол'
    # напечатать подходящее слово, используя метод group()
    print("Соответствующее слово: ", result.group())
    # Вывод 'бейсбол' 

    Давайте разберемся в приведенном выше примере .

    • Прежде всего, я использовал необработанную строку для указания шаблона регулярного выражения. Как вы, возможно, уже знаете, в некоторых случаях обратная косая черта имеет особое значение, поскольку она может указывать на escape-символ или escape-последовательность. Чтобы избежать этого, мы использовали необработанную строку.
    • Кроме того, мы не определяем и не компилируем этот шаблон заранее (как метод компиляции). Практика заключается в том, чтобы записать фактический шаблон в строковом формате.
    • Затем мы написали шаблон регулярного выражения для поиска любого восьмибуквенного слова внутри целевой строки.
    • Затем мы передали этот шаблон методу re.search() для поиска вхождений шаблона, и он вернул объект re.Match .
    • Затем мы использовали метод group() объекта re.Match для получения точного значения совпадения, т. е. бейсбольного мяча.

    Пример поиска регулярных выражений найти точную подстроку или слово

    В этом примере мы найдем подстроку «мяч» и «игрок» внутри целевой строки.

     импорт
    # Целевая строка
    target_string = "Эмма — бейсболистка, родившаяся 17 июня 1993 года."
    # найти подстроку 'мяч'
    результат = re.search(r"ball", target_string)
    # Вывести совпадающую подстроку
    печать (результат.группа())
    # вывод 'мяч'
    # найти точное слово/подстроку, окруженную границей слова
    результат = re.search(r"\bball\b", target_string)
    если результат:
        печать (результат)
    # вывод Нет
    # найти слово "игрок"
    результат = re.search(r"\bplayer\b", target_string)
    печать (результат.группа())
    # вывод 'игрок' 

    Когда использовать re.

    search()

    Метод search() всегда будет соответствовать и возвращать только первое вхождение шаблона из целевой строки.

    • Используйте его, когда хотите найти первое совпадение. Метод поиска полезен для быстрого совпадения. То есть, как только он получит первое совпадение, он остановит свое выполнение. Вы получите преимущества в производительности.
    • Также используйте его, если хотите проверить возможность наличия шаблона в длинной целевой строке.

    Избегайте использования метода search() в следующих случаях

    1. Для поиска всех вхождений в регулярном выражении используйте вместо этого метод findall() .
    2. Для поиска в начале строки используйте вместо этого метод match(). Кроме того, прочитайте регулярное выражение search() и match()

    Если вы хотите выполнить операцию поиска и замены в Python с использованием регулярного выражения, используйте метод re. sub() .

    Поиск против поиска

    Оба сервера методов search и findall имеют разную цель/вариант использования при выполнении сопоставления шаблонов регулярных выражений в Python.

    Как вы знаете, метод поиска сканирует всю строку в поисках шаблона и возвращает только первое совпадение. То есть, как только он получает первое совпадение, он останавливает свое выполнение.

    С другой стороны, метод findall() возвращает все совпадения с шаблоном.

    Поэтому используйте метод findall() для поиска всех вхождений/возможных совпадений с регулярным выражением.

    Еще одно отличие: метод поиска возвращает объект Match, который состоит из начального и конечного индексов успешного совпадения и фактического значения совпадения, которое мы можем получить с помощью метода group().

    С другой стороны, метод findall() возвращает все совпадения в виде списка Python.

    Группы поиска регулярных выражений или

    несколько шаблонов

    В этом разделе мы узнаем, как искать несколько различных шаблонов в одной и той же целевой строке. Предположим, мы хотим одновременно искать следующие два различных шаблона внутри целевой строки.

    1. Слово из десяти букв
    2. Две последовательные цифры

    Для этого напишем два шаблона регулярных выражений.

    Шаблон регулярного выражения 1 : \w{10}

    Поиск любого шестибуквенного слова внутри целевой строки будет представлять одну группу. Давайте добавим каждую группу в скобки ( ). В нашем случае r"(\w{10}).+(\d{2})"

    При успешном поиске мы можем использовать match.group(1) для получения значения совпадения первой группы и match.group(2) для получения значения совпадения второй группы.

    Теперь давайте посмотрим, как использовать эти два шаблона для поиска любого шестибуквенного слова и двух последовательных цифр внутри целевой строки.

    Пример поиска по нескольким шаблонам

     import re
    target_string = "Эмма — баскетболистка, родившаяся 17 июня. "
    # две группы заключены в отдельные скобки ( и )
    результат = re.search(r"(\w{10}).+(\d{2})", target_string)
    # Извлекаем совпадения с помощью group()
    # напечатать десятибуквенное слово
    печать (группа результатов (1))
    # Выходной баскетбол
    # напечатать двузначное число
    печать (группа результатов (2))
    # Выход 17 

    Давайте разберемся в этом примере

    • Мы заключили каждый шаблон в отдельные открывающую и закрывающую скобки.
    • Я добавил метасимвол .+ перед вторым шаблоном. точка представляет любой символ, кроме новой строки, а знак плюс означает, что предыдущий шаблон повторяется один или несколько раз. Итак, .+ означает, что перед первой группой у нас есть куча символов, которые мы можем игнорировать
    • Далее мы использовали group() метод для извлечения двух совпадающих значений.

    Примечание. Метод group() вернул два совпадающих значения, поскольку мы использовали два шаблона.

    Кроме того, прочитайте поиск шаблона регулярного выражения в текстовом файле.

    Поиск нескольких слов с использованием регулярного выражения

    Давайте возьмем другой пример и найдем любые три слова, окруженные пробелом, с помощью регулярного выражения. Давайте поищем слова «emma», «player», «born» в целевой строке.

    Применение | (вертикальная черта) для указания нескольких шаблонов.

     импорт повторно
    str1 = «Эмма — бейсболистка, родившаяся 17 июня 1993 года».
    # search() для слова из восьми букв, окруженного пробелом
    # \b используется для указания границы слова
    результат = re.findall(r"\bЭмма\b|\bplayer\b|\bborn\b", str1)
    печать (результат)
    # Output ['Emma', 'player', 'born'] 

    Поиск по регулярному выражению без учета регистра

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

    Например, вы хотите найти слово с помощью регулярного выражения в целевой строке, но вы не знаете, в каком регистре оно написано: в верхнем или нижнем регистре, или в комбинации того и другого. Здесь вы можете использовать флаг re.IGNORECASE внутри метода search() для выполнения поиска шаблона регулярного выражения без учета регистра.

    Пример :

     импорт повторно
    # Целевая строка
    target_string = "Эмма — бейсболистка, родившаяся 17 июня 1993 года."
    # поиск с учетом регистра
    результат = re.search(r"emma", target_string)
    print("Соответствующее слово:", результат)
    # Вывод Нет
    print("поиск без учета регистра")
    # использование re.IGNORECASE
    результат = re.search(r"emma", target_string, re.IGNORECASE)
    print("Соответствующее слово:", result.group())
    # Вывод 'Эмма' 

    Предыдущий :

    Python Regex Match: руководство по сопоставлению с образцом

    Next :

    Python Regex найти все совпадения

    Изменено 3 года, 3 месяца назад

    Просмотрено 19k times

    Потерпите, я не могу включить свою программу на 1000+ строк, а в описании есть пара вопросов.

    Итак, у меня есть несколько типов шаблонов, которые я ищу:

     #буквально просто обычное слово
    re.search("Слово", аргумент)
    #Вариативный сложный узор
    re.search("[0-9]{2,6}-[0-9]{2}-[0-9]{1}", аргумент)
    #Слова с разными регистрами и возможностью окончания специальных символов
    re.search("Адрес поставщика [Aa]:?|Идентификация поставщика [Ii]:?|Имя поставщика [Nn]:?", arg)
    # Я также использую re.findall для вышеуказанных шаблонов
    re.findall("использует приведенные выше шаблоны", arg
     

    Всего у меня их около 75, и некоторые нужно перенести в глубоко вложенные функции

    Когда и где я должен компилировать шаблоны?

    Прямо сейчас я пытаюсь улучшить свою программу, компилируя все в main, а затем передаю правильный список скомпилированных RegexObjects функции, которая его использует. Повысит ли это мою производительность?

    Увеличит ли скорость моей программы выполнение чего-то вроде следующего?

     перекомпилировать ("шаблон").  поиск (аргумент)
     

    Остаются ли скомпилированные шаблоны в памяти, поэтому, если функция вызывается несколько раз с этим в ней, будет ли она пропускать часть компиляции? Так что мне не пришлось бы перемещать данные из функции в функцию.

    Стоит ли компилировать все шаблоны, если я так много перемещаю данные?

    Есть ли лучший способ сопоставить обычные слова без регулярных выражений?

    Краткий пример моего кода:

     import re
    def foo(arg, allWords):
       # Делает что-то с arg, затем помещает результат в переменную,
       # эта функция не использует все слова
       data = arg # Это измененная версия arg
       возврат (бар (данные, все слова))
    полоса определения (данные, все слова):
       если allWords[0].search(data) != Нет:
          темп = данные.разделить("слово1", 1)[1]
          возврат (темп)
       elif allWords[1].search(data) != Нет:
          темп = данные.разделить("слово2", 1)[1]
          возврат (темп)
    деф основной():
       allWords = [re. compile(m) для m в ["слово1", "слово2", "слово3"]]
       arg = "Это очень длинная строка из входного текстового документа, предоставленные шаблоны могут не быть word1 в этой строке, но мне нужно проверить их, и если они есть, сделать что-то интересное word3"
       #Этот цикл выполняется пару миллионов раз
       # потому что он перебирает пару миллионов текстовых документов
       пока верно:
          данные = foo (аргумент, все слова)
     
    • python
    • регулярное выражение
    • python-2.7
    • производительность

    9

    Это сложная тема: многие ответы, даже некоторые законные источники, такие как Поваренная книга Python Дэвида Бизли, скажут вам что-то вроде:

    [Используйте compile() ], когда вы собираетесь выполнить много совпадений, используя один и тот же шаблон. Это позволяет компилировать регулярное выражение только один раз, а не при каждом совпадении. [см. с. 45 этой книги]

    Однако на самом деле это не так с версии Python 2.5. Вот примечание прямо из документов re :

    Примечание Скомпилированные версии самых последних шаблонов передаются в re.compile() , а функции сопоставления на уровне модуля кэшируются, поэтому программам, которые используют только несколько регулярных выражений одновременно, не нужно беспокоиться о компиляции обычных выражения.

    Есть два небольших аргумента против этого, но (как ни странно) они не приведут к заметной разнице во времени в большинстве случаев:

    • Размер кэша ограничен.
    • Использование скомпилированных выражений напрямую позволяет избежать накладных расходов на поиск в кэше.

    Вот элементарный тест вышеизложенного с использованием набора текстовых данных из 20 групп новостей. В относительном выражении улучшение скорости составляет около 1,6% при компиляции, предположительно в основном из-за поиска в кэше.

     импорт
    из sklearn.datasets импортировать fetch_20newsgroups
    # Список длиной ~20 000 абзацев текста
    новости = fetch_20newsgroups(subset='all', random_state=444).data
    # Токенизатор, используемый большинством векторизаторов обработки текста, таких как TF-IDF
    регулярное выражение = r'(?u)\b\w\w+\b'
    regex_comp = перекомпилировать (регулярное выражение)
    определение no_compile():
        для текста в новостях:
            re.findall (регулярное выражение, текст)
    защита с_компиляцией():
        для текста в новостях:
            regex_comp.findall(текст)
    %timeit -r 3 -n 5 no_compile()
    1,78 с ± 16,2 мс на цикл (среднее значение ± стандартное отклонение для 3 циклов, по 5 циклов в каждом)
    %timeit -r 3 -n 5 with_compile()
    1,75 с ± 12,2 мс на цикл (среднее значение ± стандартное отклонение для 3 циклов, по 5 циклов в каждом)
     

    На самом деле остается только одна очень веская причина для использования re.compile() :

    При предварительной компиляции всех выражений при загрузке модуля работа по компиляции смещается на время запуска приложения , а не на момент, когда программа может реагировать на действие пользователя. [источник; п. 15]. Нередко можно увидеть константы, объявленные в верхней части модуля с помощью compile . Например, в smtplib вы найдете OLDSTYLE_AUTH = re.compile(r"auth=(.*)", re.I) .

    Обратите внимание, что компиляция происходит (в конечном итоге) независимо от того, используете ли вы re.compile() . Когда вы используете compile() , вы компилируете переданное регулярное выражение в этот момент. Если вы используете функции уровня модуля, такие как re.search() , вы выполняете компиляцию и поиск в одном вызове. Два приведенных ниже процесса эквивалентны в этом отношении:

     # с re.compile — вы получаете объект регулярного выражения (класс)
    # и затем вызвать его метод `.search()`.
    a = re.compile('regex[es|p]') # теперь происходит компиляция
    a.search('regexp') # теперь происходит поиск
    # с функцией уровня модуля
    re.search('regex[es|p]', 'regexp') # здесь выполняются и компиляция, и поиск
     

    Наконец вы спросили,

    Есть ли лучший способ сопоставлять обычные слова без регулярных выражений?

    Да; это упоминается как «общая проблема» в HOWTO:

    Иногда использование модуля re является ошибкой. Если вы соответствуете фиксированному строка или отдельный класс символов, и вы не используете функции, такие как флаг IGNORECASE, то вся мощь обычного выражения могут не требоваться. Строки имеют несколько методов для выполнение операций с фиксированными строками, и они обычно намного быстрее, потому что реализация представляет собой один небольшой цикл C это оптимизированы для этой цели, вместо больших, более обобщенных движок регулярных выражений. [курсив добавлен]

    Короче, прежде чем переходить к ремодулю, подумайте, подходит ли ваш проблема может быть решена более быстрым и простым строковым методом.

    Предположим, что word1 , word2 … являются регулярными выражениями:

    давайте перепишем эти части:

     allWords = [re.compile(m) for m in ["word1", "word2", "word3 "]]
     

    Я бы создал одно регулярное выражение для всех шаблонов:

     allWords = re.compile("|".join(["word1", "word2", "word3"])
     

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

     allWords = re. compile("|".join("({})".format(x) for x in ["word1", "word2", " слово3"])
     

    (это, конечно, также работает со стандартными словами, и все же стоит использовать регулярные выражения из-за части | )

    теперь это замаскированный цикл с жестко закодированным каждым термином:

     полоса определения (данные, все слова):
       если все слова[0].поиск(данные):
          temp = data.split("word1", 1)[1] # работает только с нерегулярными выражениями BTW
          возврат (темп)
       Элиф allWords[1].search(данные):
          темп = данные.разделить("слово2", 1)[1]
          возврат (темп)
     

    можно переписать просто как

     def bar(data, allWords):
       вернуть allWords.split(данные,maxsplit=1)[1]
     

    с точки зрения производительности:

    • регулярное выражение компилируется при запуске, так что оно максимально быстрое
    • нет циклов или вставленных выражений, часть «или» выполняется механизмом регулярных выражений, который в большинстве случаев представляет собой скомпилированный код: не может превзойти это в чистом питоне.
    • сопоставление и разделение выполняются за одну операцию

    Последний сбой заключается в том, что внутри механизма регулярных выражений выполняется поиск всех выражений в цикле, что делает алгоритм O(n) . Чтобы сделать это быстрее, вам нужно было бы предсказать, какой шаблон является наиболее частым, и поставить его первым (моя гипотеза состоит в том, что регулярные выражения «непересекающиеся», что означает, что текст не может быть сопоставлен несколькими, иначе самый длинный должен был бы прийти перед более коротким)

    3

    Твой ответ

    Зарегистрируйтесь или войдите в систему

    Зарегистрируйтесь с помощью Google

    Зарегистрироваться через Facebook

    Зарегистрируйтесь, используя электронную почту и пароль

    Опубликовать как гость

    Электронная почта

    Требуется, но не отображается

    Опубликовать как гость

    Электронная почта

    Требуется, но не отображается

    Re.

    compile in Python

    «Регулярные выражения стали очень полезным инструментом для получения данных из баз данных, файлов, системных журналов или компьютерного кода. Когда мы используем регулярные выражения, они требуют, чтобы каждый элемент был символом. Разработчики создают шаблоны для идентификации определенных строк или наборов символов. Регулярные выражения — это наборы символов в указанном порядке, которые помогают разработчикам находить другие данные последовательности, используя определенную нотацию, поддерживаемую в шаблоне. Регулярные выражения предоставляются стандартными модулями Python, которые предварительно устанавливаются вместе с конфигурацией Python».

    Метод Re.compile()

    Последовательность регулярных выражений преобразуется из строки в класс шаблонов регулярных выражений с помощью функции re.compile(). Впоследствии с помощью методов регулярных выражений мы будем использовать этот элемент шаблона для поиска совпадений в различных целевых выражениях. Не изменяя его, мы можем собрать последовательность в модуль регулярного выражения для поиска экземпляров похожего формата в разных целевых строках.

    Использование функции re.compile()

    Существует две цели использования метода re.compile(), а именно:

    Эффективность функциональности
    Когда оператор используется более одного раза в одном приложении, сборка элементов регулярного выражения выгодна и эффективный. Функция compile() важна для первоначальной генерации и создания классов регулярных выражений. Используя эти элементы, мы можем искать экземпляры похожей последовательности в разных конкретных строках, не переписывая их, что повышает производительность и экономит время.

    Удобочитаемость
    Преимущество удобочитаемости заключается в другом. Мы можем отделить спецификацию регулярного выражения с помощью re.compile(). Если мы хотим найти разные шаблоны в определенной целевой строке, не используйте функцию compile(). Поскольку другие методы регулярных выражений выполняются во время компиляции, нам не нужно изначально использовать функцию компиляции.

    Пример 1

    Давайте рассмотрим базовый экземпляр, чтобы продемонстрировать, как применять метод re.compile().

    Мы собираем с использованием шаблона следующим образом: r’\d{3}’

    Это указывает на то, что мы начинаем с определения шаблона регулярного выражения, используя необработанную последовательность. Следующий специальный символ – это \d, который сравнивает любую цифру в указанной строке между нулем и девятью. Таким образом, значение должно появляться примерно три раза подряд в определенной строке, на что указывает цифра 3 в скобках. В этом случае мы собираемся найти любые 3 последовательных числа в конкретной строке.

    import re
    s_1 = «Айма получила оценки 187 190 179 185»
    str_pattern = r»\d{3}»
    reg_pattern = re.compile(str_pattern)
    print(type(reg_pattern))
    res = reg_pattern.findall (s_1)
    print(res)
    s_2 = «Салман получил оценки 199 180 177»
    result = reg_pattern. findall(s_2)
    print(res)

    В начале программы мы интегрируем “re заголовочный файл. Далее мы объявляем переменную «s_1», и в этой переменной мы храним числа, полученные Аймой по разным предметам. На следующем шаге мы определяем шаблон для получения 3 последовательных значений. Теперь мы компилируем требуемый строковый шаблон в элемент re.pattern.

    Для этого мы вызываем метод re.compile(). Строковый шаблон был преобразован в пригодный для использования класс re.pattern с помощью функции re.compile(). Функция print() используется для печати формата скомпилированного шаблона. Функция print() содержит параметр «тип». Далее мы получим все совпадения в первой строке, поэтому мы объявляем переменную «res» и сохраняем совпавшие элементы в этой переменной.

    Чтобы определить все возможные шаблоны почти любых трех последовательных целых чисел в определенной строке, мы использовали атрибут re.Pattern в функции re.findall(). Мы будем вызывать функцию print() для отображения вывода. Определим элементы второй строки. И эти элементы хранятся в переменной «s_2».

    Теперь мы получим все совпадения в строке 2 nd путем повторного использования одного и того же шаблона. Теперь аналогичный класс шаблона reg можно одинаково применять к различным целевым строкам для проверки трех последовательных цифр. В конце мы снова применяем метод print() для отображения результата.

    Пример 2

    Для выполнения таких операций, как поиск сходства шаблонов или замена строк, регулярные выражения накапливаются в экземплярах шаблонов.

    import re
    a = re.compile(‘[g-m]’)
    print(a.findall(«Я люблю играть в бадминтон»))

    Прежде всего, будет включен модуль «re». Термин «re» представляет собой регулярное выражение. Далее мы инициализируем переменную «a». Здесь мы вызываем функцию compile(), связанную с модулем «re». В аргументах этой функции мы определяем класс символов «g-m». На следующем шаге мы собираемся использовать метод findall(). Эта функция ищет указанное регулярное выражение, а затем возвращает список после нахождения. Наконец, метод print() используется для отображения результата.

    Пример 3

    В этом случае будут искаться все пробельные символы.

    import re
    i = re.compile(‘\d’)
    print(i.findall(«Я поеду в аэропорт в 15:00 23 ноября 2022 года»))
    i = re.compile(‘\d+’)
    print(i.findall(«Мы посетим Сват в 20:00 16 августа 2022 года»))

    Сначала будет введен пакет «re». Регулярное выражение обозначается аббревиатурой «re». Сразу устанавливаем значение переменной «i». Здесь мы вызываем связанный с модулем «re» метод compile(). Мы предоставляем регулярное выражение в параметрах этой функции. Значение атрибута «d» указывает, что оно находится в диапазоне от 0 до 9..

    На следующем шаге мы будем использовать функцию findall(). Этот метод ищет указанное регулярное выражение и, если оно найдено, возвращает список. Затем используется функция print() для отображения результата после всего этого.