Документация за модула Re за Python 3 в . Re модул за регулярни изрази

Регулярните изрази са много популярен компонент на почти всеки език за програмиране. Те ви помагат бързо да получите достъп до информацията, от която се нуждаете. По-специално, те се използват, когато е необходимо да се обработва текст. Python идва със специален модул по подразбиране. re, който отговаря за работата с регулярни изрази.

Днес ще говорим подробно за това какво е като цяло, как да работите с тях и как модулът re ще помогне.

Регулярни изрази: въведение

Какви са употребите на регулярните изрази? Почти всички. Например тези:

  1. Уеб приложения, които изискват проверка на текст. Типичен пример са онлайн клиентите за електронна поща.
  2. Всякакви други проекти, свързани с текстове, бази данни и др.

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

Какво е шаблон в библиотеката Re?

С него можете да търсите информация от различен тип, да получавате информация, съответстваща на тях, за да направите други функции по-адаптивни. И, разбира се, да обработва тези данни.

Например вземете следния шаблон: s+. Означава всеки знак за интервал. Ако добавите знак плюс към него, това означава, че моделът включва повече от един интервал. Може дори да съответства на знаци за табулация, които се извикват с t+.

Преди да ги използвате, трябва да импортирате библиотеката Re. След това използваме специална команда за компилиране на шаблона. Това става на две стъпки.

>>> import re

>>> regex = re.compile('s+')

По-конкретно, този код изпълнява операцията по компилиране на шаблон, който може да се използва. например за търсене на интервали (един или повече).

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

Да предположим, че имаме променлива, съдържаща следната информация.

>>> текст = “””100 INF Информатика

213 МАТ Математика  

156 ENG английски»»»

Съдържа три обучителни курса. Всеки от тях се състои от три части – номер, код и име. Виждаме, че интервалът между тези думи е различен. Какво да направите, за да разделите този ред на отделни числа и думи? Има два метода за постигане на тази цел:

  1. извикване на функция повторно разделяне.
  2. приложи функция разделят за регулярен.

Ето пример за използване на синтаксиса на всеки от методите за нашата променлива.

>>> re.split('s+', текст)  

# или

>>> regex.split(текст)

Изход: ['100', 'INF', 'Компютърни науки', '213', 'MAT', 'Math', '156', 'ENG', 'English']

По принцип могат да се използват и двата метода. Но всъщност е много по-лесно да използвате регулярен израз, вместо да използвате функцията многократно. повторно разделяне.

Намиране на съвпадения с три функции

Да кажем, че трябва да извлечем само числа от низ. Какво трябва да се направи за това?

re.findall()

Ето пример за използване на функцията findall(), който, заедно с регулярните изрази, ви позволява да извлечете срещания на едно или повече числа от текстова променлива.

>>> печат (текст)  

100 INF Информатика

213 МАТ Математика  

156 ENG Английски

>>> regex_num = re.compile('d+')  

>>> regex_num.findall(текст)  

['100', '213', '156']

Заедно със символа d използвахме шаблон, който показва абсолютно всяка цифрова стойност, намираща се в променлива или текст. И тъй като добавихме един + там, това означава, че трябва да присъства поне едно число. 

Можете също така да използвате знака *, за да укажете, че не е необходимо наличието на цифра за намиране на съвпадение.

Но в нашия случай, тъй като използвахме +, извлякохме с findall() 1 или повече цифрови обозначения на курсове от текста. Така в нашия случай регулярните изрази действат като настройки за функцията.

re.search() срещу re.match()

Както се досещате от името на функциите, първата търси съвпадение в текста. Въпрос: Каква е разликата между findall? Въпросът е, че връща конкретен обект, който отговаря на шаблона, а не цялата последователност от намерени резултати под формата на списък, както предишната функция.

На свой ред функцията re.match прави същото. Само синтаксисът е различен. Шаблонът трябва да бъде поставен в началото. 

Нека вземем пример, който демонстрира това.

>>> # създайте променлива с текст

>>> text2 = «»»INF Информатика

213 МАТ Математика 156″»»  

>>> # компилиране на регулярен израз и търсене на модели

>>> regex_num = re.compile('d+')  

>>> s = regex_num.search(text2)  

>>> print('Първи индекс: ', s.start())  

>>> print('Последен индекс: ', s.end())  

>>> print(text2[s.start():s.end()]) 

Първи индекс: 17 

Последен индекс: 20

213

Ако искате да получите подобен резултат по различен начин, можете да използвате функцията група().

Замяна на част от текст с Re библиотека

За да замените текст, използвайте функцията re.sub(). Да предположим, че списъкът ни с курсове се е променил малко. Виждаме, че след всяка цифрова стойност имаме раздел. Нашата задача е да комбинираме цялата тази последователност в един ред. За да направим това, трябва да заменим израза s+ да мина 

Оригиналният текст беше:

# създаване на променлива с текст

>>> текст = “””100 INF t Информатика

213 MAT t Math  

156 ENG t английски»»»  

>>> печат (текст)  

100 ИНФОРМАЦИЯ Компютърни науки

213 МАТ Математика  

156 ИНЖ Английски

За да извършим желаната операция, използвахме следните редове код.

# замени един или повече интервали с 1

>>> regex = re.compile('s+')  

>>> print(regex.sub(' ', текст))  

В резултат на това имаме един ред. 

101 COM Компютри 205 MAT Математика 189 ENG Английски

Сега разгледайте друг проблем. Не сме изправени пред задачата да поставяме интервали. За нас е много по-важно всички имена на курсове да започват на нов ред. За да направите това, се използва друг израз, който добавя нов ред към изключението. Що за израз е това?

Библиотека Re поддържа функция като отрицателно съвпадение. Различава се от директния по това, че съдържа удивителен знак пред наклонената черта. Тоест, ако трябва да пропуснем знака за нов ред, тогава трябва да напишем !n вместо n.

Получаваме следния код.

# премахнете всички интервали с изключение на нов ред  

>>> regex = re.compile('((?!n)s+)')  

>>> print(regex.sub(' ', текст))  

100 INF Информатика

213 МАТ Математика  

156 ENG Английски

Какво представляват групите с регулярни изрази?

С помощта на групи от регулярни изрази можем да получим желаните обекти под формата на отделни елементи, а не в един ред. 

Да предположим, че трябва да получим номера, кода и името на курса не в един ред, а като отделни елементи. За да изпълните задачата, ще трябва да напишете огромен брой ненужни редове код. 

Всъщност задачата може да бъде значително опростена. Можете да компилирате шаблона за всички записи и просто да посочите данните, които трябва да получите от скобите.

Ще има много малък брой линии. 

# създавайте групи от текстови шаблони на курсове и ги извличайте

>>> course_pattern = '([0-9]+)s*([A-ZY]{3})s*([a-zA-ZoY]{4,})'  

>>> re.findall(course_pattern, текст)  

[('100', 'INF', 'Компютърни науки'), ('213', 'MAT', 'Math'), ('156', 'ENG', 'English')]

Концепцията за „алчно“ съвпадение

По стандарт регулярните изрази са програмирани да извличат максимално количество съвпадащи данни. И дори ако имате нужда от много по-малко.

Нека да разгледаме примерен HTML код, където трябва да получим етикета.

>>> текст = „Пример за съвпадение на алчни регулярни изрази“  

>>> re.findall('', текст)  

[„Пример за съвпадение на алчен регулярен израз“]

Вместо да извлича само един таг, Python получава целия низ. Затова се нарича алчен.

И какво да направя, за да получите само етикета? В този случай трябва да използвате мързеливо съпоставяне. За да се уточни такъв израз, в края на модела се добавя въпросителен знак.

Ще получите следния код и изхода на интерпретатора.

>>> re.findall('', текст)  

[”, ”]

Ако се изисква да се получи само първото срещнато събитие, тогава се използва методът Търсене ().

re.search('', текст).group()  

"

Тогава ще бъде намерен само отварящият таг.

Популярни шаблони за изрази

Ето таблица, съдържаща най-често използваните модели на регулярни изрази.

Документация за модула Re за Python 3 в . Re модул за регулярни изрази

Заключение

Разгледахме само най-основните методи за работа с регулярни изрази. Във всеки случай видяхте колко важни са те. И тук няма значение дали е необходимо да анализирате целия текст или отделни негови фрагменти, дали е необходимо да анализирате публикация в социална мрежа или да съберете данни, за да ги обработите по-късно. Регулярните изрази са надежден помощник по този въпрос.

Те ви позволяват да изпълнявате задачи като:

  1. Указване на формата на данните, като имейл адрес или телефонен номер.
  2. Получаване на низ и разделянето му на няколко по-малки низа.
  3. Извършвайте различни операции с текст, като търсене, извличане на необходимата информация или замяна на част от знаците.

Регулярните изрази също ви позволяват да извършвате нетривиални операции. На пръв поглед овладяването на тази наука не е лесно. Но на практика всичко е стандартизирано, така че е достатъчно да го разберете веднъж, след което този инструмент може да се използва не само в Python, но и във всеки друг език за програмиране. Дори Excel използва регулярни изрази за автоматизиране на обработката на данни. Така че е грях да не използвате този инструмент.

Оставете коментар