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

Регулярні вирази є дуже популярним компонентом майже будь-якої мови програмування. Вони допомагають швидко отримати доступ до потрібної інформації. Зокрема, вони використовуються, коли необхідно обробити текст. Python поставляється зі спеціальним модулем за замовчуванням. re, який відповідає за роботу з регулярними виразами.

Сьогодні ми детально поговоримо про те, що це таке взагалі, як з ними працювати і як працює модуль re допоможе.

Регулярні вирази: вступ

Яке використання регулярних виразів? Майже все. Наприклад, ці:

  1. Веб-програми, які потребують перевірки тексту. Типовий приклад - поштові онлайн-клієнти.
  2. Будь-які інші проекти, пов'язані з текстами, базами даних і так далі.

Перш ніж почати розбирати синтаксис, слід більш детально розібратися в основних принципах функціонування бібліотеки re і взагалі, що в ньому взагалі хорошого. Також наведемо приклади з реальної практики, де опишемо механізм їх використання. Ви можете створити такий шаблон, придатний для виконання різноманітних операцій з текстом.

Що таке шаблон у бібліотеці Re?

З його допомогою можна шукати інформацію різного типу, отримувати відповідну їй інформацію, щоб зробити інші функції більш адаптивними. І, звичайно, обробляти ці дані.

Для прикладу візьмемо такий шаблон: s+. Це означає будь-який пробіл. Якщо ви додаєте до нього знак плюс, це означає, що шаблон містить більше одного пробілу. Він навіть може відповідати символам табуляції, які викликаються за допомогою t+.

Перед їх використанням потрібно імпортувати бібліотеку Re. Після цього ми використовуємо спеціальну команду для компіляції шаблону. Це робиться в два етапи.

>>> імпорт ре

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

Зокрема, цей код виконує операцію компіляції шаблону, який можна використовувати. наприклад, для пошуку пробілів (одного чи кількох).

Отримання окремої інформації з різних рядків за допомогою регулярних виразів

Припустимо, що у нас є змінна, що містить наступну інформацію.

>>> text = “””100 INF Інформатика

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

156 ENG Англійська»»»

Він містить три навчальні курси. Кожен з них складається з трьох частин – номера, коду та назви. Ми бачимо, що інтервал між цими словами різний. Що потрібно зробити, щоб розбити цей рядок на окремі цифри та слова? Є два методи досягнення цієї мети:

  1. викликати функцію пере.розкол.
  2. застосувати функцію розкол та цінності regex.

Ось приклад використання синтаксису кожного з методів для нашої змінної.

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

# або

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

Вихід: ['100', 'INF', 'Computer Science', '213', 'MAT', 'Math', '156', 'ENG', 'English']

Загалом можна використовувати обидва методи. Але насправді набагато простіше використовувати регулярний вираз замість використання функції кілька разів. пере.розкол.

Пошук збігів за допомогою трьох функцій

Скажімо, нам потрібно отримати лише числа з рядка. Що для цього потрібно зробити?

re.findall()

Ось приклад використання функції findall(), який разом із регулярними виразами дозволяє витягувати входження одного чи кількох чисел із текстової змінної.

>>> друк (текст)  

100 ІНФ Інформатика

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

156 ENG Англійська

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

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

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

Разом із символом d ми використовували шаблон, який вказує абсолютно будь-яке числове значення, розташоване в змінній або тексті. А оскільки ми додали туди один +, це означає, що має бути принаймні одне число. 

Ви також можете використовувати знак *, щоб вказати, що наявність цифри не є обов’язковою для пошуку відповідності.

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

re.search() проти re.match()

Як можна здогадатися з назви функцій, перша шукає збіг у тексті. Питання: Яка різниця між знайти всіх? Справа в тому, що вона повертає конкретний об'єкт, який відповідає шаблону, а не всю послідовність знайдених результатів у вигляді списку, як попередня функція.

У свою чергу, функція re.match робить те саме. Тільки синтаксис інший. Шаблон необхідно розмістити на початку. 

Візьмемо приклад, який це демонструє.

>>> # створити змінну з текстом

>>> текст2 = «»»ІНФ Інформатика

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+ пройти 

Оригінальний текст був:

# створити змінну з текстом

>>> text = “””100 INF t Інформатика

213 МАТ т мат  

156 ENG t англ»»»  

>>> друк (текст)  

100 ІНФОРМАЦІЯ Інформатика

213 XNUMX XNUMX MAT математика  

156 ENG англійська

Щоб виконати потрібну операцію, ми використали наступні рядки коду.

# замініть один або кілька пробілів на 1

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

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

В результаті маємо один рядок. 

101 COM Computers 205 MAT Математика 189 ENG Англ

Тепер розглянемо іншу проблему. Перед нами не стоїть завдання поставити пробіли. Для нас набагато важливіше, щоб назви всіх курсів починалися з нового рядка. Для цього використовується інший вираз, який додає новий рядок до винятку. Що це за вислів?

бібліотека Re підтримує таку функцію, як негативний відповідник. Відрізняється від прямого тим, що перед косою рискою містить знак оклику. Тобто, якщо нам потрібно пропустити символ нового рядка, то нам потрібно написати !n замість n.

Отримуємо наступний код.

# видалити всі пробіли, крім нового рядка  

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

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

100 ІНФ Інформатика

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

156 ENG Англійська

Що таке групи регулярних виразів?

За допомогою груп регулярних виразів ми можемо отримати потрібні об'єкти у вигляді окремих елементів, а не в одному рядку. 

Припустимо, нам потрібно отримати номер курсу, код і назву не в одному рядку, а окремими елементами. Щоб виконати завдання, вам знадобиться написати величезну кількість непотрібних рядків коду. 

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

Рядків буде дуже мало. 

# створювати групи шаблонів тексту курсу та видобувати їх

>>> шаблон_курсу = '([0-9]+)s*([A-ZY]{3})s*([a-zA-ZoY]{4,})'  

>>> re.findall(шаблон_курсу, текст)  

[('100', 'INF', 'Computer Science'), ('213', 'MAT', 'Math'), ('156', 'ENG', 'English')]

Поняття «жадібної» відповідності

За стандартом регулярні вирази запрограмовані на отримання максимальної кількості відповідних даних. І навіть якщо потрібно набагато менше.

Давайте розглянемо зразок HTML-коду, де нам потрібно отримати тег.

>>> text = “Приклад відповідності жадібного регулярного виразу”  

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

['Приклад зіставлення жадібних регулярних виразів']

Замість того, щоб витягти лише один тег, Python отримав увесь рядок. Тому його називають жадібним.

А що робити, щоб отримати тільки тег? У цьому випадку потрібно використовувати відкладене зіставлення. Для визначення такого виразу в кінці шаблону додається знак питання.

Ви отримаєте наступний код і вихід інтерпретатора.

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

[”, ”]

Якщо потрібно отримати тільки перше зустрінуте входження, то використовується метод пошук ().

re.search('', text).group()  

"

Тоді буде знайдено лише початковий тег.

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

Ось таблиця, що містить шаблони регулярних виразів, які найчастіше використовуються.

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

Висновок

Ми розглянули лише найпростіші методи роботи з регулярними виразами. У будь-якому випадку, ви бачили, наскільки вони важливі. І тут немає різниці, чи потрібно аналізувати весь текст або окремі його фрагменти, чи потрібно аналізувати пост у соціальній мережі чи збирати дані, щоб потім їх опрацювати. Надійним помічником у цій справі є регулярні вирази.

Вони дозволяють виконувати такі завдання, як:

  1. Вказати формат даних, наприклад адресу електронної пошти або номер телефону.
  2. Отримання рядка та розбиття його на кілька менших рядків.
  3. Виконуйте різні операції з текстом, такі як пошук, вилучення необхідної інформації або заміна частини символів.

Регулярні вирази також дозволяють виконувати нетривіальні операції. На перший погляд, оволодіти цією наукою непросто. Але на практиці все стандартизовано, тому досить один раз розібратися, після чого цей інструмент можна буде використовувати не тільки на Python, але і на будь-якій іншій мові програмування. Навіть Excel використовує регулярні вирази для автоматизації обробки даних. Тому гріх не скористатися цим засобом.

залишити коментар