15 примеров обработки текста с помощью Regex
Регулярные выражения (regex) – это мощный инструмент для сопоставления шаблонов и обработки текста в Python. Хотя основы regex хорошо известны, существуют продвинутые техники и сложные шаблоны, которые могут поднять ваши навыки работы с текстом на новую высоту. В этой статье мы рассмотрим 15 сложных примеров использования regex в Python, демонстрирующих его универсальность и эффективность при решении различных задач обработки текста.
Пример 1: Извлечение URL-адресов
Извлечение URL-адресов из заданного текста является распространенной задачей при веб-скреппинге и извлечении данных.
import re
text = "Visit my website at https://example.com or check out the latest news at http://news.example.com"
url_pattern = r"https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+"
urls = re.findall(url_pattern, text)
print(urls)
В этом примере мы определяем регекс-шаблон r “https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+ для поиска URL. Шаблон позволяет использовать протоколы http и https, а также фиксирует доменное имя и путь. Используя re.findall(), мы извлекаем все URL из заданного текста.
Пример 2: Проверка адресов электронной почты
Проверка адресов электронной почты на основе определенных критериев может иметь решающее значение во многих приложениях.
import re
def is_valid_email(email):
email_pattern = r"^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}$"
return re.match(email_pattern, email) is not None
print(is_valid_email("john.doe@example.com"))
print(is_valid_email("invalid_email"))
В этом фрагменте кода мы определяем regex-шаблон r”^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Z|a-z]{2,}$” для проверки адресов электронной почты. Шаблон гарантирует, что адрес электронной почты имеет правильный формат с правильной локальной частью, доменным именем и доменом верхнего уровня. Функция re.match() проверяет, соответствует ли предоставленный адрес электронной почты шаблону.
Пример 3: Извлечение хэштегов
Извлечение хэштегов из содержимого социальных сетей или текстовых данных является распространенной потребностью.
import re
text = "Just enjoying a #beautiful day with #friends in #nature"
hashtag_pattern = r"#\w+"
hashtags = re.findall(hashtag_pattern, text)
print(hashtags)
Определим шаблон r”#\w+” . Шаблон начинается с символа # и захватывает один или несколько буквенно-цифровых символов (\w+). Используя re.findall(), мы извлекаем все хэштеги из заданного текста.
Пример 4: Разбор атрибутов HTML
Давайте извлечем атрибут href из тега:
import re
html = '<a href="https://example.com">Visit our website</a>'
href_pattern = r'href="([^"]*)"'
href = re.search(href_pattern, html).group(1)
print(href)
В этом фрагменте кода мы используем регекс-шаблон r’href=”([^”])”‘ для соответствия значению атрибута href в теге ([^”]*) захватывает любой символ, кроме двойной кавычки, что позволяет нам извлечь значение атрибута. Используя re.search() и обращаясь к найденной группе с помощью .group(1), мы извлекаем значение href.
Пример 5: Токенизация слов
Токенизация слов является фундаментальным шагом в задачах обработки естественного языка (NLP). Regex может помочь нам произвести токенизацию слов на основе определенных критериев. Давайте выделим слова, исключая цифры и знаки препинания:
import re
text = "Hello! How are you today 06/12/2023? I hope everything is going well. Have a great day."
word_pattern = r"\b(?![\d.!?])\w+\b"
words = re.findall(word_pattern, text)
print(words)
В этом примере мы определяем regex-шаблон r”\b(?![\d.!?])\w+\b” для поиска слов. Шаблон использует отрицательный заголовок (?![\d.!?]), чтобы исключить цифры и знаки препинания. Маркеры \b обеспечивают совпадение полных слов. Используя re.findall(), мы извлекаем все слова из заданного текста.
Пример 6: Удаление лишних пробелов
Очистка и нормализация текста часто подразумевает удаление лишних пробельных символов. Regex предоставляет эффективный способ достижения этой цели. Давайте удалим лишние пробелы из предложения:
import re
text = "This sentence has extra whitespaces."
clean_text = re.sub(r"\s+", " ", text)
print(clean_text)
В этом фрагменте кода мы используем регекс-шаблон r”\s+” для поиска одного или нескольких пробелов подряд. Функция re.sub() заменяет все вхождения шаблона одним пробелом, эффективно удаляя лишние пробелы из предложения.
Пример 7: Разделение текста на предложения
Разделение текста на предложения – распространенная задача в обработке естественного языка. Давайте разделим абзац на предложения с помощью regex:
import re
text = "Hello! How are you today? I hope everything is going well. Have a great day."
sentence_pattern = r"(.*?[.!?])"
sentences = re.findall(sentence_pattern, text)
print(sentences)
В этом примере мы определяем регекс-шаблон r”(.?[.!?])” для поиска предложений. (.?[.!?]) захватывает любой символ (не жадный), пока не встретится точка, восклицательный или вопросительный знак. Используя re.findall(), мы извлекаем все предложения из заданного текста на основе определенного шаблона.
Пример 8: Извлечение дат
Извлечение дат из текстовых данных может быть полезным в различных приложениях. Давайте посмотрим, как regex может помочь нам извлечь даты в формате “MM-DD-YYYY”:
import re
text = "The event will take place on 06-12-2023. Don't miss it!"
date_pattern = r"\b\d{2}-\d{2}-\d{4}\b"
dates = re.findall(date_pattern, text)
print(dates)
В этом фрагменте кода мы определяем регекс-шаблон r”\b\d{2}-\d{2}-\d{4}\b” для поиска дат в формате “MM-DD-YYYY”. Шаблон состоит из маркеров \b для поиска полных дат, затем \d{2}-\d{2}-\d{4} для поиска месяца, дня и года. Используя re.findall(), мы извлекаем все даты из данного текста.
Пример 9: Извлечение IP-адресов
Извлечение IP-адресов из текстовых данных часто требуется в задачах, связанных с сетью. Давайте извлечем IP-адреса из файла журнала с помощью regex:
import re
log = "Client IP: 192.168.0.1 - Request received from 10.0.0.1 - Server IP: 172.16.0.1"
ip_pattern = r"\b(?:\d{1,3}\.){3}\d{1,3}\b"
ips = re.findall(ip_pattern, log)
print(ips)
В этом примере мы определяем регекс шаблон r”\b(?:\d{1,3}.){3}\d{1,3}\b” для поиска IP-адресов. Шаблон содержит четыре набора цифр (от 1 до 3 цифр каждый), разделенных периодами. Используя re.findall(), мы извлекаем все IP-адреса из файла журнала
Пример 10: Поиск дубликатов слов
Выявление дубликатов слов в текстовых данных может быть полезно в различных задачах анализа текста. Давайте найдем дублирующиеся слова в предложении с помощью regex:
import re
text = "This is is a test sentence to find duplicate duplicate words."
duplicate_pattern = r"\b(\w+)\b(?=.*\b\1\b)"
duplicates = re.findall(duplicate_pattern, text)
print(duplicates)
В этом фрагменте кода мы используем регекс-шаблон r”\b(\w+)\b(?=.\b\1\b)” для поиска дубликатов слов. Шаблон выделяет отдельные слова с помощью (\w+) и использует положительное опережение (?=.\b\1\b), чтобы убедиться, что то же самое слово снова появится в предложении. Используя re.findall(), мы извлекаем все дублирующиеся слова из данного предложения.
Пример 11: Удаление HTML-тегов
Удаление HTML-тегов из текстовых данных – распространенный этап предварительной обработки при веб-скреппинге и очистке данных. Давайте удалим HTML-теги из заданной строки с помощью regex:
import re
html = "<h1>Welcome to the Regex World</h1><p>Enjoy the power of regex!</p>"
clean_text = re.sub(r"<.*?>", " ", html)
print(clean_text)
В этом примере мы используем регекс-шаблон r”<.?>” для поиска HTML-тегов. Шаблон встречает любой символ (.) один или несколько раз () между < и >, эффективно захватывая HTML-теги. Функция re.sub() заменяет все вхождения шаблона пустой строкой, эффективно удаляя HTML-теги из строки.
Пример 12: Извлечение цитируемого текста
Извлечение закавыченного текста из заданной строки может быть полезно в различных приложениях. Давайте извлечем закавыченный текст с помощью regex:
import re
text = 'She said, "Life is short, enjoy every moment"'
quote_pattern = r'"([^"]*)"'
quotes = re.findall(quote_pattern, text)
print(quotes)
В этом фрагменте кода мы определяем regex-шаблон r'”([^”])”) для поиска текста, заключенного в кавычки. Шаблон захватывает любой символ, кроме двойной кавычки ([^”]) между двойными кавычками. Используя re.findall(), мы извлекаем весь закавыченный текст из заданной строки.
Пример 13: Извлечение времени из текста
Извлечение информации о времени из текстовых данных может быть полезным в различных приложениях. Давайте извлечем информацию о времени в формате “ЧЧ:ММ” из заданного текста:
import re
text = "The meeting will start at 14:30. Please be on time."
time_pattern = r"\b\d{2}:\d{2}\b"
times = re.findall(time_pattern, text)
print(times)
В этом примере мы определяем регекс-шаблон r”\b\d{2}:\d{2}\b” для поиска времени в формате “ЧЧ:ММ”. Шаблон фиксирует два набора цифр (\d{2}), разделенных двоеточием. Используя re.findall(), мы извлекаем всю информацию о времени из данного текста.
Пример 14: Удаление небуквенно-цифровых символов
Удаление небуквенно-цифровых символов из текста может быть полезно для задач очистки и предварительной обработки данных. Давайте удалим небуквенно-цифровые символы из предложения с помощью regex:
import re
text = "This sentence includes !@#$% special characters *&^."
clean_text = re.sub(r"[^a-zA-Z0-9\s]", "", text)
print(clean_text)
В этом фрагменте кода мы используем regex-шаблон r”[^a-zA-Z0-9\s]” для поиска неалфавитно-цифровых символов. Символ ^ в квадратных скобках отрицает класс символов, эффективно сопоставляя все, что не является буквой, цифрой или пробелом. Функция re.sub() заменяет все вхождения шаблона пустой строкой, эффективно удаляя небуквенно-цифровые символы из предложения.
Пример 15: Извлечение номеров социального страхования
Извлечение номеров социального страхования (SSN) из текстовых данных может быть необходимо в некоторых приложениях.
import re
text = "The SSN of John Doe is 123-45-6789."
ssn_pattern = r"\d{3}-\d{2}-\d{4}"
ssns = re.findall(ssn_pattern, text)
print(ssns)
В этом примере мы определяем регекс-шаблон r”\d{3}-\d{2}-\d{4}” для поиска номеров социального страхования в формате “XXX-XX-XXXX”. Шаблон фиксирует три цифры (\d{3}), затем дефис, две цифры (\d{2}), еще один дефис и четыре цифры (\d{4}). Используя re.findall(), мы извлекаем все SSN из данного текста.
Эти примеры демонстрируют мощь и гибкость regex в Python для решения сложных задач обработки текста. Освоив regex и используя его возможности, вы сможете эффективно работать со сложными текстовыми шаблонами и извлекать ценную информацию из различных источников.
Заключение
Regex – это мощный инструмент, позволяющий разработчикам эффективно решать сложные задачи по обработке текста. В этой статье мы рассмотрели 15 примеров использования regex в Python, продемонстрировав его универсальность в таких задачах, как извлечение URL-адресов, проверка адресов электронной почты, токенизация слов, удаление HTML-тегов и многое другое.