Регулярні вирази (регекспи або RegEx) — це спеціальний синтаксис для пошуку та обробки тексту, який використовується в програмуванні. Вони дозволяють описувати шаблони, які можуть відповідати певним підрядкам у тексті. Регулярні вирази складаються з послідовностей символів, деякі з яких мають спеціальні значення (наприклад, метасимволи), що дозволяють задавати складні умови пошуку.
Регулярні вирази широко застосовуються в різних галузях програмування та обробки даних. Вони використовуються для валідації введення користувачів, наприклад, перевірки правильності електронних адрес або номерів телефонів. Також регекспи застосовуються для пошуку та заміни тексту в великих масивах даних, аналізу журналів подій, парсингу файлів і документів. Багато мов програмування, таких як Python, JavaScript, Java, і багато інших, мають вбудовану підтримку регулярних виразів, що робить їх потужним інструментом у руках програмістів.
Цінність регулярних виразів полягає в їхній гнучкості та потужності. Вони дозволяють виконувати складні операції з текстом за допомогою відносно простих шаблонів. Це значно спрощує задачі, пов’язані з обробкою тексту, підвищуючи ефективність роботи програмістів. Регулярні вирази можуть скоротити кількість коду, необхідного для виконання певних операцій, і покращити його читабельність, що є важливим аспектом у розробці програмного забезпечення.
Синтаксис
Синтаксис регулярних виразів включає в себе різні символи та комбінації, які використовуються для пошуку текстових шаблонів. Основні елементи синтаксису включають звичайні символи, які відповідають самим собі, та спеціальні символи або метасимволи, які мають особливі значення.
- Звичайні символи: Всі літери, цифри та інші символи відповідають самим собі. Наприклад, регулярний вираз “cat” буде відповідати слову “cat” у тексті.
- Крапка (.): Цей метасимвол відповідає будь-якому одному символу. Наприклад, регулярний вираз “c.t” буде відповідати словам “cat”, “cot”, “cut” і так далі.
- Зірочка (*): Цей метасимвол означає, що попередній символ може повторюватися нуль або більше разів. Наприклад, регулярний вираз “ca*t” буде відповідати словам “ct”, “cat”, “caat”, “caaat” і так далі.
Приклади:
- Пошук простого слова: Регулярний вираз:
dog
Пояснення: Цей вираз шукає слово “dog” в тексті. Він буде відповідати кожному слову “dog”, яке зустрічається в тексті. - Пошук будь-якої літери між “c” та “t”: Регулярний вираз:
c.t
Пояснення: Крапка (.) вказує, що між “c” та “t” може бути будь-яка літера. Таким чином, цей вираз знайде слова, як “cat”, “cot”, “cut” тощо. - Пошук слова з можливими повтореннями літери “a”: Регулярний вираз:
ca*t
Пояснення: Зірочка (*) після “a” означає, що “a” може повторюватися нуль або більше разів. Тобто, цей вираз знайде слова “ct”, “cat”, “caat”, “caaat” тощо.
Спеціальні reg_exp-символи та їх приклади
Регулярні вирази мають багато спеціальних символів, які допомагають задавати складні шаблони для пошуку. Ось основні з них:
- Крапка (.)
- Опис: Відповідає будь-якому одному символу, крім нового рядка.
- Приклад 1:
a.c
знайде “abc”, “a1c”, “a-c” тощо. - Приклад 2:
c.t
знайде “cat”, “cot”, “cut” тощо.
- Зірочка (*)
- Опис: Відповідає попередньому символу нуль або більше разів.
- Приклад 1:
bo*
знайде “b”, “bo”, “boo”, “booo” тощо. - Приклад 2:
ca*t
знайде “ct”, “cat”, “caat”, “caaat” тощо.
- Плюс (+)
- Опис: Відповідає попередньому символу один або більше разів.
- Приклад 1:
a+
знайде “a”, “aa”, “aaa” тощо. - Приклад 2:
co+
знайде “co”, “coo”, “cooo” тощо.
- Знак питання (?)
- Опис: Відповідає попередньому символу нуль або один раз.
- Приклад 1:
do?g
знайде “dg” або “dog”. - Приклад 2:
colou?r
знайде “color” і “colour”.
- Дужки ([])
- Опис: Відповідає будь-якому одному символу з тих, що знаходяться всередині дужок.
- Приклад 1:
[abc]
знайде “a”, “b” або “c”. - Приклад 2:
[0-9]
знайде будь-яку цифру від 0 до 9.
- Каретка (^)
- Опис: Відповідає початку рядка.
- Приклад 1:
^Hello
знайде “Hello” на початку рядка. - Приклад 2:
^a
знайде “a” на початку рядка.
- Долар ($)
- Опис: Відповідає кінцю рядка.
- Приклад 1:
end$
знайде “end” в кінці рядка. - Приклад 2:
a$
знайде “a” в кінці рядка.
- Крапка з комою (\)
- Опис: Екранує спеціальні символи, щоб вони трактувалися як звичайні.
- Приклад 1:
\\.
знайде крапку “.”. - Приклад 2:
\\*
знайде зірочку “*”.
- Круглі дужки (())
- Опис: Групують частини регулярного виразу.
- Приклад 1:
(abc)+
знайде “abc”, “abcabc”, “abcabcabc” тощо. - Приклад 2:
(ha)+
знайде “ha”, “haha”, “hahaha” тощо.
- Вертикальна риса (|)
- Опис: Логічне “або”.
- Приклад 1:
a|b
знайде “a” або “b”. - Приклад 2:
cat|dog
знайде “cat” або “dog”.
Опис конструкцій регулярних виразів та приклади їх використання
Регулярні вирази мають багато спеціальних конструкцій, які допомагають задавати шаблони для пошуку тексту. Ось опис основних конструкцій та приклади для кожної з них:
1. Кількісні вирази ({})
Опис: Вказують точну кількість повторень попереднього символу або виразу.
- Приклад 1:
a{3}
знайде “aaa”. - Приклад 2:
\d{2,4}
знайде від 2 до 4 цифр поспіль, наприклад “12”, “123”, “1234”.
2. Буквені класи (\d, \w, \s)
Опис: \d – цифра, \w – слово (літера або цифра), \s – пробіл.
- Приклад 1:
\d+
знайде одну або більше цифр, наприклад “123”. - Приклад 2:
\w+
знайде одне або більше слів, наприклад “hello123”.
3. Негативні класи (\D, \W, \S)
Опис: \D – не цифра, \W – не слово, \S – не пробіл.
- Приклад 1:
\D+
знайде одну або більше нецифр, наприклад “abc!”. - Приклад 2:
\W+
знайде один або більше несловесних символів, наприклад “!@#”.
4. Лінива квантифікація (.*?, .+?, .??)
Опис: Квантифікатори, які шукають найкоротший можливий збіг.
- Приклад 1:
a.*?b
знайде найкоротший підрядок, що починається з “a” і закінчується на “b”, наприклад “a123b”. - Приклад 2:
".+?"
знайде найкоротший підрядок у лапках, наприклад ” “hello” “.
5. Відрицальні групи (?!)
Опис: Відповідає, якщо вираз не знайдений після вказаного шаблону.
- Приклад 1:
a(?!b)
знайде “a”, якщо за ним не йде “b”. - Приклад 2:
foo(?!bar)
знайде “foo”, якщо за ним не йде “bar”.
Комбінації метасимволів та приклади їх використання
Комбінації метасимволів у регулярних виразах дозволяють створювати складні шаблони для пошуку тексту. Ось деякі популярні комбінації та приклади їх використання:
1. Комбінація \b
і \w
Опис: \b
позначає межу слова, а \w
відповідає будь-якому словесному символу (букві, цифрі або підкресленню). Разом вони можуть використовуватися для пошуку слів у тексті.
Приклад 1: Пошук слова, яке починається з “cat”.
import re
text = "The catalog contains categories of cats."
pattern = r'\bcat\w*'
matches = re.findall(pattern, text)
print(matches) # Output: ['catalog', 'categories', 'cats']
Пояснення: Вираз \bcat\w*
шукає слова, що починаються з “cat” і можуть мати будь-яку кількість словесних символів після цього.
Приклад 2: Пошук слова, яке закінчується на “ing”.
import re
text = "I am running and jumping while thinking."
pattern = r'\b\w+ing\b'
matches = re.findall(pattern, text)
print(matches) # Output: ['running', 'jumping', 'thinking']
Пояснення: Вираз \b\w+ing\b
шукає слова, що закінчуються на “ing” і мають будь-яку кількість словесних символів перед цим.
2. Комбінація \d
, {}
і -
Опис: \d
відповідає цифрі, а {}
вказує на кількість повторень попереднього символу. Разом вони можуть використовуватися для пошуку числових шаблонів, таких як дати або номери телефонів.
Приклад 1: Пошук дати у форматі “YYYY-MM-DD”.
import re
text = "The event is scheduled for 2023-06-15."
pattern = r'\b\d{4}-\d{2}-\d{2}\b'
match = re.search(pattern, text)
if match:
print(match.group()) # Output: 2023-06-15
Пояснення: Вираз \b\d{4}-\d{2}-\d{2}\b
шукає дати у форматі “YYYY-MM-DD”, де \d{4}
означає чотири цифри, \d{2}
означає дві цифри, а тире “-” просто включене в шаблон.
Приклад 2: Пошук номеру телефону у форматі “XXX-XXX-XXXX”.
import re
text = "Contact me at 123-456-7890 or 987-654-3210."
pattern = r'\b\d{3}-\d{3}-\d{4}\b'
matches = re.findall(pattern, text)
print(matches) # Output: ['123-456-7890', '987-654-3210']
Пояснення: Вираз \b\d{3}-\d{3}-\d{4}\b
шукає номери телефонів у форматі “XXX-XXX-XXXX”, де кожна група з трьох або чотирьох цифр розділена тире.
Ці приклади демонструють, як комбінації метасимволів можуть бути використані для складних пошукових шаблонів, що допомагають знаходити специфічні патерни в тексті.
ТОП 10 найпопулярніших регулярок
Ось топ 10 найпопулярніших прикладів використання регулярних виразів (RegEx) в Python, які можуть бути корисними в різних сценаріях:
1. Перевірка електронної пошти
import re
email = "[email protected]"
pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
if re.match(pattern, email):
print("Valid email")
else:
print("Invalid email")
2. Пошук усіх чисел у рядку
import re
text = "There are 123 apples and 45 oranges."
pattern = r'\d+'
numbers = re.findall(pattern, text)
print(numbers) # Output: ['123', '45']
3. Витягнення домену з URL
import re
url = "https://www.example.com"
pattern = r'https?://(www\.)?([^/]+)'
match = re.search(pattern, url)
if match:
domain = match.group(2)
print(domain) # Output: example.com
3. Заміна всіх пробілів на підкреслення
import re
text = "Replace all spaces with underscores."
pattern = r'\s+'
new_text = re.sub(pattern, '_', text)
print(new_text) # Output: Replace_all_spaces_with_underscores.
5. Пошук слів, що починаються з великої літери
import re
text = "This is a Sample Text with Capitalized Words."
pattern = r'\b[A-Z][a-z]*\b'
capitalized_words = re.findall(pattern, text)
print(capitalized_words) # Output: ['This', 'Sample', 'Text', 'Capitalized', 'Words']
6. Перевірка наявності певного слова в тексті
import re
text = "Do you have a cat?"
pattern = r'\bcat\b'
if re.search(pattern, text):
print("The word 'cat' is present.")
else:
print("The word 'cat' is not present.")
7. Видалення всіх неалфавітних символів
import re
text = "Clean this text! Remove all 123 numbers and symbols."
pattern = r'[^a-zA-Z\s]'
cleaned_text = re.sub(pattern, '', text)
print(cleaned_text) # Output: Clean this text Remove all numbers and symbols
8. Розбиття тексту на слова
import re
text = "Split this text into words."
pattern = r'\W+'
words = re.split(pattern, text)
print(words) # Output: ['Split', 'this', 'text', 'into', 'words', '']
9. Перевірка формату дати (YYYY-MM-DD)
import re
date = "2023-06-05"
pattern = r'^\d{4}-\d{2}-\d{2}$'
if re.match(pattern, date):
print("Valid date format")
else:
print("Invalid date format")
10. Пошук IP-адреси в тексті
import re
text = "The server IP address is 192.168.1.1."
pattern = r'\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b'
ip_address = re.search(pattern, text)
if ip_address:
print(ip_address.group()) # Output: 192.168.1.1
Ці приклади демонструють, як регулярні вирази можуть бути використані для різних завдань обробки тексту в Python, від перевірки форматів і витягування інформації до пошуку та заміни тексту.
Додаткові сервіси для допомоги в написані reg_exp
https://regex101.com
https://regexr.com
https://www.regextester.com
Онлайн тренінг
https://regexone.com/
https://www.therobinlord.com/projects/slash-escape
Регулярні вирази (RegEx) — це дуже потужний інструмент для обробки тексту. Регулярні вирази можуть спочатку виглядати складними, але з практикою і правильними ресурсами вони стануть потужним інструментом у вашому арсеналі програміста.
🚀Долучайтесь до нашої спільноти Telegram:
🚀Долучайтесь до нашої спільноти FaceBook:
🚀Долучайтесь до нашої спільноти Twiter X: