|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Использование регулярных выражений
Время создания: 31.08.2017 21:00
Текстовые метки: code
Раздел: Python - Modules - re
Запись: xintrea/mytetra_db_mcold/master/base/1502897204eejg34t8m5/text.html на raw.githubusercontent.com
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Использование регулярных выражений в Python для новичков
В последние годы языки общего назначения стали чаще использоваться для анализа данных. Разработчики и организации используют Python или Javascript для решения своих задач. И в этом им помогают регулярные выражения. Они — незаменимый инструмент для упорядочивания, причесывания, поиска или извлечения текстовых данных. Все это делает регулярные выражения полезными для изучения. В этой статье мы рассмотрим примеры использования и применения регулярных выражений. Они часто используются программистами в различных языках — Perl, С++, Java. Мы будем использовать Python. Ближе к концу мы также посмотрим на некоторые реальные задачи, решаемые с их помощью. Что такое регулярные выражения и как их использовать? Говоря простым языком, регулярное выражение — это последовательность символов, используемая для поиска и замены текста в строке или файле. Как уже было упомянуто, их поддерживает множество языков общего назначения: Python, Perl, R. Так что изучение регулярных выражений рано или поздно пригодится. Регулярные выражения используют два типа символов: специальные символы: как следует из названия, у этих символов есть специальные значения. Аналогично символу *, который как правило означает «любой символ» (но в регулярных выражениях работает немного иначе, о чем поговорим ниже); литералы (например: a, b, 1, 2 и т. д.). В Python для работы с регулярными выражениями есть модуль re. Для использования его нужно импортировать: 1 import re Чаще всего регулярные выражения используются для: поиска в строке; разбиения строки на подстроки; замены части строки. Давайте посмотрим на методы, которые предоставляет библиотека re для этих задач. Вот наиболее часто используемые из них: re.match() re.search() re.findall() re.split() re.sub() re.compile() Рассмотрим их подробнее. re.match(pattern, string): Этот метод ищет по заданному шаблону в начале строки. Например, если мы вызовем метод match() на строке «AV Analytics AV» с шаблоном «AV», то он завершится успешно. Однако если мы будем искать «Analytics», то результат будет отрицательный. Давайте посмотрим на его работу:
Искомая подстрока найдена. Чтобы вывести ее содержимое, используем метод group(). (Мы используем «r» перед строкой шаблона, чтобы показать, что это «сырая» строка в Python).
Теперь попробуем найти «Analytics» в данной строке. Поскольку строка начинается на «AV», метод вернет None:
Также есть методы start() и end() для того, чтобы узнать начальную и конечную позицию найденной строки.
Эти методы иногда очень полезны для работы со строками. re.search(pattern, string): Этот метод похож на match(), но он ищет не только в начале строки. В отличие от предыдущего, search() вернет объект, если мы попытаемся найти «Analytics».
Метод search() ищет по всей строке, но возвращает только первое найденное совпадение. re.findall(pattern, string): Этот метод возвращает список всех найденных совпадений. У метода findall() нет ограничений на поиск в начале или конце строки. Если мы будем искать «AV» в нашей строке, он вернет все вхождения «AV». Для поиска рекомендуется использовать именно findall(), так как он может работать и как re.search(), и как re.match().
re.split(pattern, string, [maxsplit=0]): Этот метод разделяет строку по заданному шаблону.
В примере мы разделили слово «Analytics» по букве «y». Метод split() принимает также аргумент maxsplit со значением по умолчанию, равным 0. В данном случае он разделит строку столько раз, сколько возможно, но если указать этот аргумент, то разделение будет произведено не более указанного количества раз. Давайте посмотрим на примеры:
Мы установили параметр maxsplit равным 1, и в результате строка была разделена на две части вместо трех. re.sub(pattern, repl, string): Этот метод ищет шаблон в строке и заменяет его на указанную подстроку. Если шаблон не найден, строка остается неизменной.
re.compile(pattern, repl, string): Мы можем собрать регулярное выражение в отдельный объект, который может быть использован для поиска. Это также избавляет от переписывания одного и того же выражения.
До сих пор мы рассматривали поиск определенной последовательности символов. Но что, если у нас нет определенного шаблона, и нам надо вернуть набор символов из строки, отвечающий определенным правилам? Такая задача часто стоит при извлечении информации из строк. Это можно сделать, написав выражение с использованием специальных символов. Вот наиболее часто используемые из них:
Больше информации по специальным символам, таким как (), | и др., можно найти на странице документации: https://docs.python.org/2/library/re.html). Теперь давайте посмотрим на примеры использования регулярных выражений. Примеры использования регулярных выражений Задача 1: Вернуть первое слово из строки Сначала попробуем вытащить каждый символ (используя .) Для того, чтобы в конечный результат не попал пробел, используем вместо . \w. Теперь попробуем достать каждое слово (используя * или +)
И снова в результат попали пробелы, так как * означает «ноль или более символов». Для того, чтобы их убрать, используем +:
Теперь вытащим первое слово, используя ^:
Если мы используем $ вместо ^, то мы получим последнее слово, а не первое:
Задача 2: Вернуть первые два символа каждого слова Вариант 1: используя \w, вытащить два последовательных символа, кроме пробельных, из каждого слова:
Вариант 2: вытащить два последовательных символа, используя символ границы слова (\b):
Задача 3: вернуть список доменов из списка адресов электронной почты Давайте снова рассмотрим решение пошагово. Сначала вернем все символы после «@»:
Как видим, части «.com», «.in» и т. д. не попали в результат. Изменим наш код:
Второй вариант — вытащить только домен верхнего уровня, используя группировку — ( ):
Задача 4: Извлечь дату из строки Используем \d для извлечения цифр.
Для извлечения только года нам опять помогут скобки:
Задача 5: Извлечь все слова, начинающиеся на гласную Для начала вернем все слова:
А теперь — только те, которые начинаются на определенные буквы (используя []):
Выше мы видим обрезанные слова «argest» и «ommunity». Для того, чтобы убрать их, используем \b для обозначения границы слова:
Также мы можем использовать ^ внутри квадратных скобок для инвертирования группы:
В результат попали слова, «начинающиеся» с пробела. Уберем их, включив пробел в диапазон в квадратных скобках:
Задача 6: Проверить телефонный номер (номер должен быть длиной 10 знаков и начинаться с 8 или 9) У нас есть список телефонных номеров, и нам нужно проверить их, используя регулярные выражения:
Задача 7: Разбить строку по нескольким разделителям Возможное решение:
Также мы можем использовать метод re.sub() для замены всех разделителей пробелами:
Задача 8: Извлечь информацию из html-файла Допустим, нам надо извлечь информацию из html-файла, заключенную между <td> и </td>, кроме первого столбца с номером. Также будем считать, что html-код содержится в строке. Пример содержимого html-файла:
Решение (если поместить содержимое файла в переменную test_str): Заключение В этой статье мы узнали, что такое регулярные выражения и как их использовать, на примере библиотеки re в Python. Кроме того, мы рассмотрели наиболее часто встречающиеся задачи, в которых их можно применить. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Так же в этом разделе:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|