Регулярните изрази са концепция, използвана за търсене на модели в низов текст.

https://www.activestate.com/wp-content/uploads/2020/03/Python-RegEx-Cheatsheet.pdf

Това е универсална концепция за всеки език за програмиране или програма за редактиране на текст.

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

Ключове за RegEx

.       - Any Character Except New Line
\d      - Digit (0-9)
\D      - Not a Digit (0-9)
\w      - Word Character (a-z, A-Z, 0-9, _)
\W      - Not a Word Character
\s      - Whitespace (space, tab, newline)
\S      - Not Whitespace (space, tab, newline)
\b      - Word Boundary
\B      - Not a Word Boundary
^       - Beginning of a String
$       - End of a String
[]      - Matches Characters in brackets
[^ ]    - Matches Characters NOT in brackets
|       - Either Or
( )     - Group
Quantifiers:
*       - 0 or More
+       - 1 or More
?       - 0 or One
{3}     - Exact Number
{3,4}   - Range of Numbers (Minimum, Maximum)

Импортиране на reбиблиотеки:

import re

text_to_search = '''
abcdefghijklmnopqurtuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
1234567890
123abc

Hello HelloHello

MetaCharacters (Need to be escaped):
. ^ $ * + ? { } [ ] \ | ( )

gmail.com

321-555-4321
123.555.1234

[email protected]

Mr. Johnson
Mr Smith
Ms Davis
Mrs. Robinson
Mr. T
'''

Търсене на литерали

pattern = re.compile(r'cba')
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)
Output: Will search for the literals 'cba' in the text.

Търсене на специални знаци

Различни специални знаци:

Квадратни скоби []
Квадратните скоби се използват за указване на набор от знаци — поне един от които трябва да съвпада, но не повече от един, освен ако не е указано друго.

Пример: Malwareb[yi]es ще съответстват на Malwarebytes и Malwarebites, а не на Malwarebyites.

Знакът минус –
Знакът минус или тире се използва за указване на диапазон от знаци.
Пример: [0–9] ще бъде съвпадение за всеки единичен цифра между 0 и 9.

Къдрави скоби {}
Къдравите скоби се използват за количествено определяне на броя знаци.
Пример: [0–9]{3} съвпада с произволна числова последователност между 000 и 999

Скоби ()
Скобите се използват за групиране на знаци. Съвпаденията съдържат знаците в техния точен ред.

Пример: (са) дава съвпадение за злонамерен софтуер, но не и за антена, тъй като следният ред на знаците е различен от спецификацията.

Наклонена черта |
Наклонената черта, както в много езици, означава логическия оператор „или“.
Пример: Most|more ще съответства и на двете определени думи.

Точка .
Точката или точката действат като заместващ знак. Съвпада с всеки отделен знак, с изключение на знаците за прекъсване на ред.
Пример: Malwareb.tes ще съответства на Malwarebytes, Malwarebites, Malwarebotes и много други, но все още не и на Malwarebyites.

Наклонена черта \

Обратната наклонена черта се използва за избягване на специални знаци и за придаване на специално значение на някои знаци, които го следват.
Примери: \d съвпада с едно цяло число (0–9).
\w съвпада с един буквено-цифров знак.

Звездичка *
Звездичката е повторител. Съвпада, когато знакът пред него съвпада 0 или повече пъти.
Пример: cho*se ще съвпада за chose и choose, но също и за chse (нулево съвпадение).

Звездичка и точка .*
Звездичката се използва в комбинация с точката за съвпадение на всеки знак 0 или повече пъти.
Пример : Злонамерен софтуер.* ще съответства на Зловреден софтуер, Malwarebytes и всяка грешно изписана версия, която започва със Зловреден софтуер.

Знак плюс +
Знакът плюс съвпада, когато знакът пред + съвпада 1 или повече пъти.
Пример: cho+se ще съвпада за chose и select, но не за chse.

pattern = re.compile(r'.')
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)
Output: Any Character Except New Line
pattern = re.compile(r'\.')
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

Изход: Всички знаци ‘.’

‹re.Match обект; span=(129, 130), match=’.’›
‹re.Match обект; span=(163, 164), match=’.’›
‹re.Match обект; span=(185, 186), match=’.’›
‹re.Match обект; span=(189, 190), match=’.’›
‹re.Match обект; span=(211, 212), match=’.’›
‹re.Match обект; span=(219, 220), match=’.’›
‹re.Match обект; span=(250, 251), match=’.’›
‹re.Match обект; span=(263, 264), match=’.’›

pattern = re.compile(r'\D')
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

pattern = re.compile(r'\d\w')
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

pattern = re.compile(r'\d\s')
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

Граница на думите

# Hello HelloHello
pattern = re.compile(r'Hello') #searching for 'Hello'
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

Изход:

<re.Match object; span=(74, 79), match='Hello'>
<re.Match object; span=(80, 85), match='Hello'>
<re.Match object; span=(85, 90), match='Hello'>
pattern = re.compile(r'Hello\b') #Word Boundary
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

Изход:

<re.Match object; span=(74, 79), match=’Hello’> 
<re.Match object; span=(85, 90), match=’Hello’>
Note: Here we searched for the pattern were 'Hello' was followed by word boundary(space/new line etc.)
pattern = re.compile(r'\bHello\b')
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

Изход:

<re.Match object; span=(74, 79), match='Hello'>
Other Worth trying examples:
pattern = re.compile(r'\BHello\b') # \B - Not word boundary
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

pattern = re.compile(r'\b\d')
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

pattern = re.compile(r'^\s') #Whitespace (space, tab, newline) at beginning of string
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

Набори от знаци

pattern = re.compile(r'[123]\w')
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

Изход:

<re.Match object; span=(55, 57), match='12'>
<re.Match object; span=(57, 59), match='34'>
<re.Match object; span=(66, 68), match='12'>
<re.Match object; span=(68, 70), match='3a'>
<re.Match object; span=(169, 171), match='32'>
<re.Match object; span=(178, 180), match='32'>
<re.Match object; span=(182, 184), match='12'>
<re.Match object; span=(190, 192), match='12'>
<re.Match object; span=(192, 194), match='34'>
pattern = re.compile(r'[a-z][a-z]')
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

pattern = re.compile(r'[a-zA-Z0-9][a-zA-z-]')
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

pattern = re.compile(r'[a-zA-Z][^a-zA-z]')
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

Групи знаци

pattern = re.compile(r'(abc|com|texas)\b')
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

pattern = re.compile(r'([A-Z]|llo)[a-zA-z]')
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

Квантори

pattern = re.compile(r'Mr\.?\s[A-Z]')
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

pattern = re.compile(r'Mr\.?\s[A-Z][a-z]*')
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

pattern = re.compile(r'M(s|rs)\.?\s[A-Z][a-z]*')
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

pattern = re.compile(r'\d{3}[.-]\d{3}[.-]\d{4}')
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

pattern = re.compile(r'[a-zA-Z0-9_]+\.[a-z]{3}')
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

pattern = re.compile(r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+')
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat)

Достъп до информация в обекта Match

pattern = re.compile(r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]{2,4}')
matches = pattern.finditer(text_to_search)
for mat in matches:
    print(mat.span(0))
    print(mat.group(0))
    print(text_to_search[mat.span(0)[0]:mat.span(0)[1]])
urls = r'''
https://www.google.com
http://yahoo.com
https://www.whitehouse.gov
https://craigslist.org
'''
pattern = re.compile(r'https?://(www\.)?\w+\.\w+')
matches = pattern.finditer(urls)
for mat in matches:
    print(mat)
pattern = re.compile(r'https?://(www\.)?(\w+)(\.\w+)')
matches = pattern.finditer(urls)
for mat in matches:
    print(mat.group(2)+mat.group(3))
pattern = re.compile(r'https?://(www\.)?(\w+)(\.\w+)')
matches = pattern.finditer(urls)
for mat in matches:
    print(mat.group(0))
    print(urls[mat.span(2)[0]:mat.span(2)[1]]+urls[mat.span(3)[0]:mat.span(3)[1]])