Python re find group

Объект re.Match, методы re.search, re.finditer, re.findall

На предыдущих занятиях мы с вами рассмотрели основы построения регулярных выражений. Теперь пришло время научиться применять их, используя различные методы модуля re.

  • «здесь и сейчас» для однократного применения правила;
  • компиляция и обработка, для многократного использования одного и того же правила.
import re text = "" match = re.search(r"#[\da-fA-F]\b", text) print(match)

Мы здесь определяем шаблон в виде: «#[\da-fA-F]<6>\b» который передаем в виде строки первым параметром метода search, и на выходе получаем объект re.Match со следующими свойствами: Если же вхождение не будет найдено, то метод search возвращает значение None:

match = re.search(r"#[\da-fA-F]\b", text)

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

Свойства и методы объекта re.Match

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

match = re.search(r"(\w+)=(#[\da-fA-F])\b", text)

Перейдем в консольный режим для удобства работы. Смотрите, у нас здесь две сохраняющие скобки: для атрибута и для значения. В действительности, метод search и другие ему подобные создают следующую иерархию вхождений: И мы в этом можем легко убедиться, вызвав метод group объекта re.Match:

match.group(0) match.group(1) match.group(2)

На выходе получим кортеж из соответствующих вхождений: (‘color=#CC0000’, ‘color’, ‘#CC0000’) Также можно вызвать метод

Читайте также:  Простой хлеб

который возвращает кортеж из всех групп, начиная с индекса 1. У этого метода есть необязательный параметр default, который определяет возвращаемое значение для групп, не участвующих в совпадении. Свойство lastindex содержит индекс последней группы:

Если нам нужно узнать позиции в тексте начала и конца группы, то для этого служат методы start и end:

Если по каким-то причинам группа не участвовала в совпадении (например, ее вхождение было от 0), то данные методы возвращают -1. Также мы можем получить сразу кортеж с начальной и конечной позициями для каждой группы:

Для определения первого и последнего индексов, в пределах которых осуществлялась проверка в тексте, служат свойства:

match = re.search(r"(?P\w+)=(?P#[\da-fA-F])\b", text)

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

Методы re.search, re.finditer и re.findall

  • pattern – регулярное выражение;
  • string – анализируемая строка;
  • flags – один или несколько флагов.
match = re.search(r"(?P\w+)=(?P#[\da-fA-F])\b", text)

выведет всего две группы для первого атрибута: (‘color’, ‘#CC0000’) Если нужно найти все совпадения, то можно воспользоваться методом re.finditer(pattern, string, flags) который возвращает итерируемый объект для перебора всех вхождений:

for m in re.finditer(r"(?P\w+)=(?P#[\da-fA-F])\b", text): print(m.groups())

На выходе получим две коллекции для первого и второго атрибутов: (‘color’, ‘#CC0000’)
(‘bg’, ‘#ffffff’) Однако, часто на практике нам нужно получить лишь список найденных вхождений, групп и это проще реализовать с помощью метода re.findall(pattern, string, flags) следующим образом:

match = re.findall(r"(?P\w+)=(?P#[\da-fA-F])\b", text) print(match)

На выходе будет список кортежей: [(‘color’, ‘#CC0000’), (‘bg’, ‘#ffffff’)] Недостатком последнего метода является ограниченность полученных данных: здесь лишь список, тогда как два предыдущих метода возвращали объект re.Match, обладающий, как мы только что видели, богатым функционалом. Но, если списка достаточно, то метод findall может быть вполне удобным и подходящим. На следующем занятии мы продолжим рассматривать методы модуля re для обработки строк посредством регулярных выражений.

Источник

Оцените статью