Что такое регулярные выражения (регулярное выражение): -

Регулярное выражение (regex) — это последовательность символов, используемая для сопоставления с образцом и манипуляций со строками. Они обеспечивают краткий способ описания сложных текстовых шаблонов, обеспечивая эффективный поиск. Регулярные выражения кратки, но могут быть сложными из-за особых символов и шаблонов. Regex также позволяет пользователям выполнять расширенное сопоставление шаблонов, группировку, обратные ссылки и просмотр вперед/назад. В этом посте мы рассмотрим регулярное выражение с использованием Python3.

Регулярное выражение Python: -

Python имеет встроенный модуль под названием «re», который необходимо импортировать для работы с Regex.

Мета-персонажи: -

В регулярном выражении есть метасимволы, которые используются для создания шаблонов регулярных выражений. Вот список различных мета-персонажей:

Специальные последовательности: -

Это краткие представления часто встречающихся шаблонов. Они упрощают некоторые сложные узоры. Вот список:

ПРИМЕЧАНИЕ: — Я не включил все специальные последовательности, есть и другие последовательности, такие как (\B, \W и т. д.)

Пример:

import re

text = "x8989072"  
x = r'\A[a-zA-Z][0-9]+'

result = bool(re.match(x, text))
print(result)  # Output: True

Это вернет «Истина», если строка начинается с любого алфавита (строчного ИЛИ верхнего регистра) и за ней следует любая цифра от «0 до 9» один ИЛИ большее количество раз.

Функция search() в Regex: -

Это используется для поиска соответствия строки в зависимости от требования. Он всегда возвращает первое совпадение в строке (отображаются не все совпадения).

import re

text = "Stop Scrolling Instagram, Start Learning Python"
x = re.search(r"S", text)
print(x)
# Output: <re.Match object; span=(0, 1), match='S'>

Как видите, рассматривалось только первое слово «Стоп». Это связано с тем, что функция поиска возвращает только первое совпадение из строки.

Функция findall() в Regex: -

Эта функция возвращает массив (список), содержащий все совпадения на основе нашего регулярного выражения.

import re

text = "AI's AI coded AI for AI to decipher AI's complex AI algorithms."
x = re.findall(r"AI", text)
print(x)
# Output: ['AI', 'AI', 'AI', 'AI', 'AI', 'AI']

Здесь мы можем наблюдать, что функция findall() создала массив, куда добавила все экземпляры слова «AI», найденные в нашей строке.

Функция sub() в Regex: -

Эта функция заменит совпадения символом/текстом по вашему выбору.

import re

text = "Anxious alligators awkwardly assembled, eagerly awaiting their afternoon appetizer."
x = re.sub("a", "@", text)
print(x)
# Output: Anxious @llig@tors @wkw@rdly @ssembled, e@gerly @w@iting their @fternoon @ppetizer.

Здесь мы видим, что все вхождения буквы «а» были заменены символом «@».

Функция Split() в Regex: -

Это вернет массив (список), в котором строка разбивается на основе введенных нами данных.

import re

txt = "AI wrote a poem; roses are #FF0000, violets are #0000FF."
x = re.split("\s", txt)
print(x)
# Output: ['AI', 'wrote', 'a', 'poem;', 'roses', 'are', '#FF0000,', 'violets', 'are', '#0000FF.']

В этом примере я разделяю строку в любом экземпляре пробельного символа (\s).

Классы персонажей: -

Классы символов в регулярном выражении позволяют вам определить группу символов, которым вы хотите сопоставить. Они заключаются в «[]» (квадратные скобки). Пример: регулярное выражение «[aeiou]» соответствует любой гласной в вашей строке. Вот список, чтобы лучше их понять:

Пример:

import re

text = "Python has different libraries such as pandas, numpy, pytorch, scikit-learn, etc"
x = re.findall(r"[^aeiou\s]", text)
print(x)

Этот код удалит из строки все гласные и пробелы. Классы символов также называются наборами.

Кванторы: -

Кванторы в регулярном выражении контролируют количество вхождений предыдущего элемента. Они позволяют указать, сколько раз символ, группа или класс символов должен появляться во входной строке. Вот список, чтобы лучше их понять:

Пример:

import re

text = "My email address is [email protected] and my phone number is 45"
x = re.findall(r"[0-9]{3,4}", text)
print(x)
# Output: ['8008']

Это вернет только те цифры, которые встречаются непрерывно не менее 3 раз ИЛИ не более 4 раз.

Прогнозы: -

Просмотры — это расширенные функции регулярных выражений, которые позволяют проверять наличие шаблонов перед текущей позицией в строке, фактически не включая их в сопоставление.

Положительный просмотр вперед «(?=content)» утверждает, что указанный шаблон должен находиться перед текущей позицией в строке.

Отрицательный просмотр вперед «(?!content)» утверждает, что указанный шаблон не должен опережать текущую позицию.

Пример: Предположим, вы хотите найти все вхождения слова «ананас», только если за ним следует слово «сок».

import re

text = "I love pineapple juice, but I do not like pineapple ice-cream."
result = re.findall(r'pineapple(?= juice)', text)

if result:
    print("Found 'pineapple' followed by 'juice'")
    print(result)  
else:
    print("No match found")

Это пример позитивного прогноза.

Осмотр: -

Lookbehinds — это расширенные функции, которые позволяют вам проверять закономерности за текущей позицией в строке.

Положительный просмотр «(?‹=content)» утверждает, что указанный шаблон должен находиться за текущей позицией.

Отрицательный просмотр «(?‹!content)» утверждает, что указанный шаблон не должен находиться за текущей позицией.

Пример: Предположим, вы хотите найти все вхождения слова «цветок», только если ему не предшествует слово «синий».

import re

text = "A red flower is my favourite, but blue flower is my father's favourite."
result = re.findall(r'(?<!blue )flower', text)

if result:
    print("Found 'flower' not preceded by 'blue'")
    print(result)
else:
    print("No match found")

Это пример негативного взгляда назад.

Давай попрактикуемся: -

Вот несколько сложных способов использования Regex:

Проверка электронной почты: -

import re

def validate_email(email):
    pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
    return bool(re.match(pattern, email))  

print(validate_email("[email protected]"))  # True
print(validate_email("invalid. Email"))    # False

Удаление HTML-тегов: -

import re

def remove_html_tags(text):
    pattern = r'<.*?>'
    return re.sub(pattern, '', text)

html_text = "<p>This is <b>bold</b> text.</p>"
print(remove_html_tags(html_text)) 
# Output: "This is bold text."

Извлечение данных из заданного текста: -

import re

def extract_dates(text):
    pattern = r'\d{2}/\d{2}/\d{4}'
    return re.findall(pattern, text)

unstructured_text = "Meeting on 12/25/2023 and 01/15/2024"
print(extract_dates(unstructured_text)) 
# Output: ['12/25/2023', '01/15/2024']

Проверка надежности пароля: -

import re

def check_password_strength(password):
    if re.match(r'^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[@#$%&\_])[A-Za-z\d@#$%&\_]{8,}$', password):
        return "Strong"
    else:
        return "Weak"

print(check_password_strength("P@ssw0rd"))  # Strong
print(check_password_strength("password"))  # Weak

Это регулярное выражение имеет следующие ограничения: -

  1. пароль должен быть длиной не менее 8 символов
  2. он должен содержать прописную и строчную букву
  3. он должен содержать хотя бы 1 цифру
  4. он должен содержать хотя бы 1 специальный символ (@#$%&_)

Проверка IP-адреса: -

import re

def validate_ip(ip):
    pattern = r'^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'
    return all(re.match(pattern, part) for part in ip.split('.'))

print(validate_ip("192.168.1.1"))     # True
print(validate_ip("256.256.256.256")) # False

Токенизация: -

import re

text = "He didn't want to go, but he had to. She said, 'It's time.'"
tokens = re.findall(r"\b\w+(?:[-']\w+)*\b|[.,!?';]", text)
print(tokens)

Токенизация может стать довольно сложной задачей при работе с различными текстовыми структурами, языками и особыми случаями. Вышеприведенный пример регулярного выражения включает совпадения дефисов и апострофов (например, «Он», «не сделал»).

Ресурсы: -

Вот несколько отличных ресурсов для практики Regex:

Питекс: -

Pythex — это редактор регулярных выражений на основе Python, в котором вы можете тестировать примеры регулярных выражений.

Рексегг: -

На этом веб-сайте вы можете найти подробные руководства по различным подтемам, связанным с регулярными выражениями (например, обратные ссылки, группировка захвата, вызовы PCRE и т. д.).

Тестер регулярных выражений ExtendsClass: -

На этом сайте вы тестируете свои шаблоны регулярных выражений. Он также поддерживает различные языки программирования, такие как Python3, Ruby, Java, PHP и т. д.

Регулярное выражение101: -

Этот веб-сайт позволяет вам протестировать шаблоны регулярных выражений. Он поддерживает такие языки программирования, как Python, Golang, Java, Rust, C# и т. д.

Шпаргалка по регулярному выражению Python: -

Документ Regex для Python.

Спасибо, что дочитали до конца, вы отлично справились с расшифровкой моей путаницы с регулярными выражениями.

Следуйте за мной в Twitter.