Урок 21. Регулярні вирази

Функція findall()

У Python функція findall() належить до модуля re, який використовується для роботи з регулярними виразами. Ця функція шукає всі неперервні входження шаблону в рядку і повертає їх у вигляді списку. Приклад з відео:

#"RegEx", або регулярний вираз, це 
#послідовність символів, яка утворює
#шаблон пошуку.
#RegEx можна використовувати, щоб перевірити, 
#чи містить рядок вказаний шаблон пошуку.
#Python має вбудований пакет під назвою re, 
#з яким можна працювати
#Імпортуйте модуль re.
#Функція findall() повертає список із усіма збігами.
import re

str1 = "It was raining outside."
mathcList = re.findall("rain", str1)
print(str1)
print(mathcList)

Приклад з findall(), якщо не було збігів:

#Якщо збігів не знайдено, 
#повертається порожній список
import re

str1 = "It was raining outside."
matchList = re.findall("snowing",str1)
print(str1)
print(matchList)
СимволОписПриклад
[]Набір символів“[a-m]”
\Сигналізує спеціальну послідовність (також може використовуватися для екранування спеціальних символів)“\d”
.Будь-який символ (крім символу нового рядка)“ra..g”
^Починається з“^It”
$Закінчується на“side.$”
*Нуль або більше випадків“ra.*g”
+Один або кілька випадків“ra.+g”
?Нуль або один раз“ra.?g”
{}Точно вказана кількість повторень“ra.{4}g”
|Або або“raining|snowing”
Метасимволи

Приклад із метсимволами з відео:

import re

str1 = "15th December. It was raining outside."
#Знайти всі символи нижнього регістру в 
#алфавітному порядку між «a» і «y»:
searchResult = re.findall("[a-y]", str1)
print("All lower case characters")
print(searchResult)
#Знайти всі цифрові символи:
searchResult2 = re.findall("\d", str1)
print(searchResult2)
#Пошук послідовності, яка починається з "ra", а потім чотири (будь-які)
#символи та "g":
searchResult3 = re.findall("ra....g", str1)
print(searchResult3)

Ще приклад із застосуванням метсимволів з відео:

import re

str1 = "It was raining outside."
#Перевірте, чи рядок починається з "It":
searchResult = re.findall("^It", str1)
print(searchResult)
#Перевірте, чи закінчується рядок на 'side.':
searchResult2 = re.findall("side.$", str1)
print(searchResult2)
#Пошук послідовності, яка починається з "ra", після чого йде 0 
#або більше символів і "g":
searchResult3 = re.findall("ra.*g", str1)
print(searchResult3)

Ще один приклад з метасимволами з відео:

import re
str1 = "It was raining outside."
#Пошук послідовності, яка починається 
#з "ra", за якою йде 1 або більше
# (будь-яких) символів та "g"
searchResult = re.findall("ra.+g", str1)
print(searchResult)
#Пошук послідовності, яка починається 
#з "ra", після чого йде 0 або 1
#символ і "g":
searchResult2 = re.findall("ra.?g", str1)
print(searchResult2)
#Пошук послідовності, яка починається 
#з "ra", з точним дотриманням
#4 символи та "g"
searchResult3 = re.findall("ra.{4}g",str1)
print(searchResult3)
#Перевірте, чи рядок містить текст "raining" чи "snowing"
searchResult4 = re.findall("raining|snowing",str1)
print(searchResult4)

Також findall() можна застосовувати зі спеціальними послідовностями.

СимволОписПриклад
\AПовертає збіг, якщо вказані символи знаходяться на початку рядка“\AThe”
\bПовертає збіг, якщо вказані символи знаходяться на початку або в кінці слова (“r” на початку впевнюється, що рядок розглядається як “необроблений рядок”)r”\bain”
r”ain\b”
\BПовертає збіг, якщо вказані символи присутні, але НЕ на початку (чи в кінці) слова (“r” на початку гарантує, що рядок розглядається як “необроблений рядок”)r”\Bain”
r”ain\B”
\dПовертає збіг, якщо рядок містить цифри (числа від 0 до 9)“\d”
\DПовертає збіг, якщо рядок НЕ містить цифр“\D”
\sПовертає збіг, якщо рядок містить пробіл“\s”
\SПовертає збіг, якщо рядок НЕ містить пробілу“\S”
\wПовертає збіг, якщо рядок містить будь-які символи слова (символи від a до Z, цифри від 0 до 9 і символ підкреслення _)“\w”
\WПовертає збіг, якщо рядок НЕ містить символів слів“\W”
\ZПовертає збіг, якщо вказані символи знаходяться в кінці рядка“Spain\Z”
Спеціальні послідовності

Приклад зі спеціальними символами з відео:

import re
str1 = "25th December. It was raining outside."
#Перевірте, чи починається рядок з "It"
searchResult = re.findall("\AIt", str1)
print(searchResult)
#Перевірте, чи є слово «rain» на початку слова
searchResult2 = re.findall(r"\brain", str1)
print(searchResult2)
#Перевірте, чи є "ing" у кінці слова
searchResult3 = re.findall(r"ing\b", str1)
print(searchResult3)
#Перевірте, чи присутній "ini", але НЕ на початку слова
searchResult4 = re.findall(r"\Bini", str1)
print(searchResult4)
#Перевірте, чи містить рядок якісь цифри (від 0 до 9)
searchResult5 = re.findall("\d", str1)
print(searchResult5)

Ще один приклад з відео зі спецсимволами:

import re
str1 = "25th December. It was raining outside."
#Повертати збіг для кожного символу без цифр
print("Return a match at every no-digit character")
searchResult = re.findall("\D", str1)
print(searchResult)
#Повертати збіг для кожного пробілу
print("Return a match at every white-space character")
searchResult2 = re.findall("\s", str1)
print(searchResult2)
#Повертати збіг для кожного НЕ пробілу
print("Return a match at every NON white-space character")
searchResult3 = re.findall("\S", str1)
print(searchResult3)
#Повертати збіг для кожного символу слова 
#(символи від a до Z, цифри від 0 до 9 і символ підкреслення _)"
print("Return a match at every word character (characters from a to Z, digits from 0-9, and the underscore _ character)")
searchResult4 = re.findall("\w", str1)
print(searchResult4)
#Повертати збіг для кожного НЕ символу слова 
#(символи НЕ між a і Z. Наприклад \"!\", \"?\" пробіл тощо)
print("Return a match at every NON word character (characters NOT between a and Z. Like \"!\", \"?\" white-space etc.)")
searchResult5 = re.findall("\W", str1)
print(searchResult5)
#Перевірте, чи закінчується рядок на \"outside.\
print("Check if the string ends with \"outside.\"")
searchResult6 = re.findall("outside.\Z", str1)
print(searchResult6)

З findall() також часто використовуються sets або набори символів.

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, нижнього АБО верхнього регістру
[+]У наборах +, *, ., |, (), $,{} не мають спеціального значення, тому [+] означає: повертає збіг для будь-якого символу + у рядку
Набори символів

Приклад з наборами символів з відео:

import re
str1 = "25th December. It was raining outside."
#Перевірте, чи містить рядок символи j, i або w
searchResult = re.findall("[jiw]", str1)
print(searchResult)
#Перевірте, чи містить рядок символи між j і w
searchResult2 = re.findall("[j-w]", str1)
print(searchResult2)
#Перевірте, чи містить рядок інші символи, крім j, i чи w
searchResult3 = re.findall("[^jiw]", str1)
print(searchResult3)
#Перевірте, чи містить рядок 1, 2, 3, 4 або 5 цифр
searchResult4 = re.findall("[12345]", str1)
print(searchResult4)

Ще один приклад з відео з наборами символів:

import re
str1 = "25th December. It was raining outside.+"
#Перевірте, чи містить рядок цифри від 0 до 9
searchResult = re.findall("[0-9]", str1)
print(searchResult)
#Перевірте, чи містить рядок двозначні числа від 00 до 99
searchResult2 = re.findall("[0-9][0-9]", str1)
print(searchResult2)
#Перевірте, чи містить рядок символи 
#від a до w нижнього регістру,
#і від A до Y у верхньому регістрі
searchResult3 = re.findall("[a-wA-Y]", str1)
print(searchResult3)
#Перевірте, чи містить рядок символи +
searchResult4 = re.findall("[+]", str1)
print(searchResult4)

Функція search()

Функція search() у Python також належить до модуля re, який використовується для роботи з регулярними виразами. Ця функція шукає перше входження шаблону в рядку і повертає об’єкт-результат, якщо знайдено, або None, якщо входження не виявлено. Приклад з відео:

#Функція search() шукає збіг у рядку та повертає
#Match об'єкт, якщо є збіг.
#Якщо є більше одного збігу, лише перший збіг
#повернеться.
import re

str1 = "It was raining outside."
match1 = re.search("\s", str1)
print(match1)
print("Position of space: ", match1.start())

Ще один приклад із застосуванням функції search() з відео:

#Якщо збігів не знайдено, 
#повертається значення None
import re

str1 = "It was raining outside."
match1 = re.search("snowing", str1)
print(match1)

Функція split()

Функція split() у Python використовується для розділення рядка на список підрядків на основі роздільника. Приклад з відео:

#Функція split() повертає список, 
#де було розділено рядок
#по кожному збігу.
import re

str1 = "It was raining outside."
splitedList = re.split("\s", str1)
print(str1)
print(splitedList)
print(str1)

Ще один приклад із застосуванням функції split():

#Ви можете контролювати кількість 
#повторень, вказавши
#параметр maxsplit
import re

str1 = "It was raining outside."
splitedList = re.split("\s", str1, 1)
print(str1)
print(splitedList)

Функція sub()

Функція sub() у Python належить до модуля re і використовується для заміни частин рядка, які відповідають заданому регулярному виразу, на інший рядок. Приклад з відео:

#Функція sub() замінює збіги 
#текстом за вашим вибором
import re

str1 = "It was raining outside."
substitutedStr1 = re.sub("\s", "-", str1)

print(str1)
print(substitutedStr1)

Ще один приклад із sub() з відео:

#Ви можете контролювати кількість замін, 
#вказавши параметр count
import re

str1 = "It was raining outside."
substitutedStr1 = re.sub("\s", "-", str1, 1)

print(str1)
print(substitutedStr1)

Match object

Match object (об’єкт відповідності) у Python є результатом виконання функцій модуля re, таких, наприклад, як search() та findall(). Цей об’єкт надає інформацію про знайдене входження регулярного виразу в рядок. Він містить різні методи та атрибути, які дозволяють отримати деталі про знайдене входження.  Приклад з відео:

#Об’єкт відповідності – це об’єкт, 
#що містить інформацію про пошук
#і результат.
#Якщо збігу немає, замість нього 
#буде повернено значення None
import re

str1 = "It was raining outside."
searchResult = re.search("rain", str1)
print(searchResult)

Приклад  з  Match object та span():

#.span() повертає кортеж, 
#що містить початкову та кінцеву позиції
#збігу.
#Регулярний вираз шукає будь-які слова, 
#які починаються з малої літери "r"
import re

str1 = "It was raining outside."
searchResult = re.search(r"\br\w+", str1)
print(searchResult)
print(searchResult.span())

Приклад  з  Match object та group():

#.group() повертає частину 
#рядка, де був збіг
#Регулярний вираз шукає будь-які 
#слова, які починаються з малої літери "r"
import re

str1 = "It was raining outside."
searchResult = re.search(r"\br\w+", str1)
print(searchResult)
print(searchResult.group())

Приклад  з  Match object та string:

#.string повертає рядок, переданий у функцію
#Регулярний вираз шукає будь-які слова, 
#які починаються з малої літери "r"
import re

str1 = "It was raining outside."
searchResult = re.search(r"\br\w+", str1)
print(searchResult)
print(searchResult.string)
Урок 21. Регулярні вирази

В цьому відео поговоримо про:
00:00:08 findall() Function
00:05:20 Metacharacters – метасимволи
00:20:07 Special Sequences – Спеціальні послідовності
00:43:41 Sets – набори у регулярних виразах
00:57:07 search() Function
01:01:44 split()
01:06:40 sub()
01:09:46 Match object

Приклади на Github

Leave a Reply

Your email address will not be published. Required fields are marked *