res в питоне что это
Регулярные выражения в Python
Перевод статьи «Python Regular Expression».
Обычное использование регулярного выражения:
Основы
Регулярное выражение – это комбинация символов и метасимволов. Из метасимволов доступны следующие:
re.search()
Этот метод возвращает совпадающую часть строки и останавливается сразу же, как находит первое совпадение. Таким образом, его можно использовать для проверки выражения, а не для извлечения данных.
Синтаксис: re.search(шаблон, строка)
Давайте разберем пример: поищем в строке месяц и число.
re.match()
Этот метод ищет и возвращает первое совпадение. Но надо учесть, что он проверяет соответствие только в начале строки.
Синтаксис: re.match(шаблон, строка)
Теперь давайте посмотрим на пример. Проверим, совпадает ли строка с шаблоном.
Рассмотрим другой пример. Здесь «July 20» находится не в начале строки, поэтому результатом кода будет «Not a valid date»
re.findall()
Этот метод возвращает все совпадения с шаблоном, которые встречаются в строке. При этом строка проверяется от начала до конца. Совпадения возвращаются в том порядке, в котором они идут в исходной строке.
Синтаксис: re.findall(шаблон, строка)
Возвращаемое значение может быть либо списком строк, совпавших с шаблоном, либо пустым списком, если совпадений не нашлось.
Рассмотрим пример. Используем регулярное выражение для поиска чисел в исходной строке.
Или другой пример. Теперь нам нужно найти в заданном тексте номер мобильного телефона. То есть, в данном случае, нам нужно десятизначное число.
re.compile()
С помощью этого метода регулярные выражения компилируются в объекты шаблона и могут использоваться в других методах. Рассмотрим это на примере поиска совпадений с шаблоном.
re.split()
Данный метод разделяет строку по заданному шаблону. Если шаблон найден, оставшиеся символы из строки возвращаются в виде результирующего списка. Более того, мы можем указать максимальное количество разделений для нашей строки.
Синтаксис: re.split(шаблон, строка, maxsplit = 0)
Возвращаемое значение может быть либо списком строк, на которые была разделена исходная строка, либо пустым списком, если совпадений с шаблоном не нашлось.
Рассмотрим, как работает данный метод, на примере.
re.sub()
Здесь значение «sub» — это сокращение от substring, т.е. подстрока. В данном методе исходный шаблон сопоставляется с заданной строкой и, если подстрока найдена, она заменяется параметром repl.
Синтаксис: re.sub(шаблон, repl, строка, count = 0, flags = 0)
В результате работы кода возвращается либо измененная строка, либо исходная.
Посмотрим на работу метода на следующем примере.
re.subn()
Синтаксис: re.subn(шаблон, repl, строка, count = 0, flags = 0)
Рассмотрим такой пример.
re.escape()
Этот метод возвращает строку с обратной косой чертой \ перед каждым не буквенно-числовым символом. Это полезно, если мы хотим сопоставить произвольную буквенную строку, которая может содержать метасимволы регулярного выражения.
Чтобы лучше понять принцип работы метода, рассмотрим следующий пример.
Заключение
Сегодня мы поговорили о регулярных выражениях в Python и о том, что необходимо для их понимания в любом приложении. Мы изучили различные методы и метасимволы, присутствующие в регулярных выражениях Python, на примерах.
Как использовать регулярные выражения в Python. Примеры для новичков
В последнее время языки общего назначения стали гораздо чаще применяться для анализа данных. Организации и разработчики используют Javascript или Python для решения многих задач. И на помощь им приходят регулярные выражения, которые выступают эффективным инструментом для причесывания, упорядочивания, извлечения или поиска текстовых данных.
Именно поэтому возник такой высокий спрос вокруг изучения регулярных выражений. Ниже мы рассмотрим примеры их использования. Они часто применяются в разных языках программирования – C++, Perl, Java. Мы же рассмотрим примеры их использования на языке Pythone.
Регулярные выражения – что это? Как их использовать?
Регулярные выражения представляют собой последовательность символов, применяемых для поиска и замены текста в файле или строке. Поскольку их поддерживает большинство языков программирования, их изучение точно не будет для вас лишним.
Регулярные выражения применяют 2 типа символов:
Программисты, работают с регулярными выражения в Python используется модуль re. Для его использования необходимо импортировать:
В большинстве случаев регулярные выражения применяются для:
Методы
Теперь рассмотрим методы, которые предлагает библиотека re для решения этих задач. Вот самые популярные из них:
Остановимся на каждом детально.
re.match(pattern, string)
Данный метод ищет по указанному шаблону в начале строки. К примеру, если вызвать метод match() на строке «AV Analytics AV» с шаблоном «AV», то он будет завершен успешно. Но если искать «Analytics», результат станет отрицательным. Пример:
import re
result = re.match(r’AV’, ‘AV Analytics Vidhya AV’)
print result
Искомпая подстрока найдена. Для того чтобы вывести ее содержимое, применяем метод group().
result = re.match(r’AV’, ‘AV Analytics Vidhya AV’)
print result.group(0)
AV
Найдем «Analytics» в этой строке. Метод вернет None, так как она начинается на «AV»:
result = re.match(r’Analytics’, ‘AV Analytics Vidhya AV’)
print result
Чтобы узнать начальную/конечную позицию найденной строки используются методы start() и end().
result = re.match(r’AV’, ‘AV Analytics Vidhya AV’)
print result.start()
print result.end()
Иногда такие методы оказываются весьма полезными при работе со строками.
re.search(pattern, string)
Данный метод схож с match(), однако он ищет не только в начале строки. Если мы попробуем найти «Analytics», то search() вернет объект, в отличие от предыдущего.
result = re.search(r’Analytics’, ‘AV Analytics Vidhya AV’)
print result.group(0)
Несмотря на то, что метод search() ищет по всей строке, он возвращается исключительно в первое совпадение, которое было им обнаружено.
re.findall(pattern, string)
Метод findall() возвращает все найденные совпадения. У него нет ограничение на поиск в конце или в начале строки. Поэтому если вы будете искать «AV» в нашей строке, метод вернет все его вхождения. Для поиска лучше использовать именно метод findall(), поскольку он может работать как re.match() и re.search().
result = re.findall(r’AV’, ‘AV Analytics Vidhya AV’)
print result
re.split(pattern, string, [maxsplit=0])
Данный метод разделяет строку по указанному шаблону.
В нашем примере разделено слово «Analytics» по букве «y». Также метод split() принимает аргумент maxsplit со значением 0 (по умолчанию). В таком случае он разделит строку столько раз, сколько это возможно, если это условия не будет задано. Обратите внимание на примеры:
result = re.split(r’i’, ‘Analytics Vidhya’)
print result
[‘Analyt’, ‘cs V’, ‘dhya’] # все возможные участки.
result = re.split(r’i’, ‘Analytics Vidhya’,maxsplit=1)
print result
В примере параметр maxsplit = 1, поэтому строка разделилась на 2 части, а не на 3.
re.sub(pattern, repl, string)
Такой метод ищет шаблон в строке, после чего заменяет его на заданную подстроку. В том случае, если шаблон не найден, строка не меняется.
result = re.sub(r’India’, ‘the World’, ‘AV is largest Analytics community of India’)
print result
‘AV is largest Analytics community of the World’
re.compile(pattern, repl, string)
При необходимости можно собрать регулярное выражения в отдельный объект и использовать его для поиска. Одновременно с этим можно решить проблему переписывания одного и того же выражения.
pattern = re.compile(‘AV’)
result = pattern.findall(‘AV Analytics Vidhya AV’)
print result
result2 = pattern.findall(‘AV is largest analytics community of India’)
print result2
В примерах был приведен поиск определенной последовательности символов. А как быть, если нет определенного шаблона, а наша задача – вернуть набор символов из строки, которая отвечает определенным правилам? Чаще всего это требуется при извлечении информации из строк. Этого можно добиться, прибегнув к специальным символам. Приведем самые популярные из них:
Примеры использования регулярных выражений
Вернуть первое слово из строки
Прежде всего попытаемся вытащить каждый символ
result = re.findall(r’.’, ‘AV is largest Analytics community of India’)
print result
result = re.findall(r’\w’, ‘AV is largest Analytics community of India’)
print result
Сейчас достанем каждое слово (применяя + или *)
result = re.findall(r’\w*’, ‘AV is largest Analytics community of India’)
print result
В результат снова попали пробелы, поскольку * означает «ноль или больше символов». Используя + удается решить эту проблему:
result = re.findall(r’\w+’, ‘AV is largest Analytics community of India’)
print result
Дальше вытащим первое слово, применяя ^:
result = re.findall(r’^\w+’, ‘AV is largest Analytics community of India’)
print result
result = re.findall(r’\w+$’, ‘AV is largest Analytics community of India’)
print result
Вернуть первые 2 символа каждого слова
Способ 1: применяя \w, вытащить два последовательных символа, за исключением пробельных, из каждого слова:
result = re.findall(r’\w\w’, ‘AV is largest Analytics community of India’)
print result
Способ 2: вытащить два последовательных символа, применяя символ границы слова (\b):
result = re.findall(r’\b\w.’, ‘AV is largest Analytics community of India’)
print result
Способ 3: вернуть список доменов из списка адресов электронного почтового адреса
Поэтапное решение задачи. Для начала нужно вернуть все символы после «@»:
result = re.findall(r’@\w+’, ‘abc.test@gmail.com, xyz@test.in, test.first@analyticsvidhya.com, first.test@rest.biz’)
print result
Части «.com», «.in» и так далее не попали в результат. Внесем изменения в код:
result = re.findall(r’@\w+.\w+’, ‘abc.test@gmail.com, xyz@test.in, test.first@analyticsvidhya.com, first.test@rest.biz’)
print result
Альтернативный способ — вытащить домен верхнего уровня, применяя группировку — ( ):
result = re.findall(r’@\w+.(\w+)’, ‘abc.test@gmail.com, xyz@test.in, test.first@analyticsvidhya.com, first.test@rest.biz’)
print result
Извлечь дату из строки
Применяем \d для извлечения цифр.
result = re.findall(r’\d<2>-\d<2>-\d<4>’, ‘Amit 34-3456 12-05-2007, XYZ 56-4532 11-11-2011, ABC 67-8945 12-01-2009’)
print result
Для извлечения только года на помощь придут скобки:
result = re.findall(r’\d<2>-\d<2>-(\d<4>)’, ‘Amit 34-3456 12-05-2007, XYZ 56-4532 11-11-2011, ABC 67-8945 12-01-2009’)
print result
Извлечь все слова, начинающиеся с гласной
Вначале вернем все слова:
result = re.findall(r’\w+’, ‘AV is largest Analytics community of India’)
print result
Затем вернем только те, которые начинаются на определенные буквы, в чем поможет []:
result = re.findall(r'[aeiouAEIOU]\w+’, ‘AV is largest Analytics community of India’)
print result
В примере представлены обрезанные слова «argest» и «ommunity». Чтобы убрать их, применяем \b, чтобы обозначить границы слова:
result = re.findall(r’\b[aeiouAEIOU]\w+’, ‘AV is largest Analytics community of India’)
print result
Еще один вариант — использовать ^ внутри квадратных скобок с целью инвертирования группы:
result = re.findall(r’\b[^aeiouAEIOU]\w+’, ‘AV is largest Analytics community of India’)
print result
[‘ is’, ‘ largest’, ‘ Analytics’, ‘ community’, ‘ of’, ‘ India’]
Видим, что в результат попали слова, которые начинаются с пробелам. Чтобы решить проблему – включите пробел в квадратные скобки.
result = re.findall(r’\b[^aeiouAEIOU ]\w+’, ‘AV is largest Analytics community of India’)
print result
Проверить номер телефона (он должен начинаться с 8 или 9 с длиной в 10 знаков)
Необходимо проверить список телефонных номеров с помощью регулярных выражений.
for val in li:
if re.match(r’8<1>6<9>’, val) and len(val) == 10:
print ‘yes’
else:
print ‘no’
Разбить строку по нескольким разделителям
line = ‘asdf fjdk;afed,fjek,asdf,foo’ # String has multiple delimiters («;»,»,»,» «).
result = re.split(r'[;,\s]’, line)
print result
К тому же можно использовать метод re.sub(), чтобы заменить пробелами всех разделителей.
line = ‘asdf fjdk;afed,fjek,asdf,foo’
result = re.sub(r'[;,\s]’,’ ‘, line)
print result
asdf fjdk afed fjek asdf foo
Извлечь данные из html-файла
Пример содержимого файла:
Решение (если поместить содержимое htmlфайла в переменную test_str):
[(‘Noah’, ‘Emma’), (‘Liam’, ‘Olivia’), (‘Mason’, ‘Sophia’), (‘Jacob’, ‘Isabella’), (‘William’, ‘Ava’), (‘Ethan’, ‘Mia’), (‘Michael’, ‘Emily’)]
Выводы
Теперь вы знаете, что такое регулярные выражения и для каких задач их можно использовать. Все примеры были приведены для библиотеки re в Python.
Если у вас остались вопросы или вы столкнулись со сложностями, сообщите нам в комментариях.
Python RegEx: практическое применение регулярок
Рассмотрим регулярные выражения в Python, начиная синтаксисом и заканчивая примерами использования.
Примечание Вы читаете улучшенную версию некогда выпущенной нами статьи.
Основы регулярных выражений
Регулярками называются шаблоны, которые используются для поиска соответствующего фрагмента текста и сопоставления символов.
Грубо говоря, у нас есть input-поле, в которое должен вводиться email-адрес. Но пока мы не зададим проверку валидности введённого email-адреса, в этой строке может оказаться совершенно любой набор символов, а нам это не нужно.
Чтобы выявить ошибку при вводе некорректного адреса электронной почты, можно использовать следующее регулярное выражение:
По сути, наш шаблон — это набор символов, который проверяет строку на соответствие заданному правилу. Давайте разберёмся, как это работает.
Синтаксис RegEx
Синтаксис у регулярок необычный. Символы могут быть как буквами или цифрами, так и метасимволами, которые задают шаблон строки:
Также есть дополнительные конструкции, которые позволяют сокращать регулярные выражения:
Для чего используются регулярные выражения
Синтаксис таких выражений в основном стандартизирован, так что вам следует понять их лишь раз, чтобы использовать в любом языке программирования.
Примечание Не стоит забывать, что регулярные выражения не всегда оптимальны, и для простых операций часто достаточно встроенных в Python функций.
Хотите узнать больше? Обратите внимание на статью о регулярках для новичков.
Регулярные выражения в Python
А вот наиболее популярные методы, которые предоставляет модуль:
Рассмотрим каждый из них подробнее.
re.match(pattern, string)
Этот метод ищет по заданному шаблону в начале строки. Например, если мы вызовем метод match() на строке «AV Analytics AV» с шаблоном «AV», то он завершится успешно. Но если мы будем искать «Analytics», то результат будет отрицательный:
Искомая подстрока найдена. Чтобы вывести её содержимое, применим метод group() (мы используем «r» перед строкой шаблона, чтобы показать, что это «сырая» строка в Python):
Теперь попробуем найти «Analytics» в данной строке. Поскольку строка начинается на «AV», метод вернет None :
Также есть методы start() и end() для того, чтобы узнать начальную и конечную позицию найденной строки.
Эти методы иногда очень полезны для работы со строками.
re.search(pattern, string)
Метод search() ищет по всей строке, но возвращает только первое найденное совпадение.
re.findall(pattern, string)
re.split(pattern, string, [maxsplit=0])
Этот метод разделяет строку по заданному шаблону.
В примере мы разделили слово «Analytics» по букве «y». Метод split() принимает также аргумент maxsplit со значением по умолчанию, равным 0. В данном случае он разделит строку столько раз, сколько возможно, но если указать этот аргумент, то разделение будет произведено не более указанного количества раз. Давайте посмотрим на примеры Python RegEx:
Мы установили параметр maxsplit равным 1, и в результате строка была разделена на две части вместо трех.
re.sub(pattern, repl, string)
Ищет шаблон в строке и заменяет его на указанную подстроку. Если шаблон не найден, строка остается неизменной.
re.compile(pattern, repl, string)
Мы можем собрать регулярное выражение в отдельный объект, который может быть использован для поиска. Это также избавляет от переписывания одного и того же выражения.
До сих пор мы рассматривали поиск определенной последовательности символов. Но что, если у нас нет определенного шаблона, и нам надо вернуть набор символов из строки, отвечающий определенным правилам? Такая задача часто стоит при извлечении информации из строк. Это можно сделать, написав выражение с использованием специальных символов. Вот наиболее часто используемые из них:
Оператор | Описание |
---|---|
. | Один любой символ, кроме новой строки \n. |
? | 0 или 1 вхождение шаблона слева |
+ | 1 и более вхождений шаблона слева |
* | 0 и более вхождений шаблона слева |
\w | Любая цифра или буква (\W — все, кроме буквы или цифры) |
\d | Любая цифра 7 (\D — все, кроме цифры) |
\s | Любой пробельный символ (\S — любой непробельный символ) |
\b | Граница слова |
[..] | Один из символов в скобках ([^..] — любой символ, кроме тех, что в скобках) |
\ | Экранирование специальных символов (\. означает точку или \+ — знак «плюс») |
^ и $ | Начало и конец строки соответственно |
От n до m вхождений ( — от 0 до m) | |
a|b | Соответствует a или b |
() | Группирует выражение и возвращает найденный текст |
\t, \n, \r | Символ табуляции, новой строки и возврата каретки соответственно |
Больше информации по специальным символам можно найти в документации для регулярных выражений в Python 3.
Перейдём к практическому применению Python регулярных выражений и рассмотрим примеры.
Задачи
Вернуть первое слово из строки
Теперь попробуем достать каждое слово (используя * или + )
И снова в результат попали пробелы, так как * означает «ноль или более символов». Для того, чтобы их убрать, используем + :
Теперь вытащим первое слово, используя ^ :
Вернуть первые два символа каждого слова
Вариант 2: вытащить два последовательных символа, используя символ границы слова ( \b ):
Вернуть домены из списка email-адресов
Сначала вернём все символы после «@»:
Как видим, части «.com», «.in» и т. д. не попали в результат. Изменим наш код:
Второй вариант — вытащить только домен верхнего уровня, используя группировку — ( ) :
Извлечь дату из строки
Используем \d для извлечения цифр.
Для извлечения только года нам опять помогут скобки:
Извлечь слова, начинающиеся на гласную
Для начала вернем все слова:
А теперь — только те, которые начинаются на определенные буквы (используя [] ):
Выше мы видим обрезанные слова «argest» и «ommunity». Для того, чтобы убрать их, используем \b для обозначения границы слова:
Также мы можем использовать ^ внутри квадратных скобок для инвертирования группы:
В результат попали слова, «начинающиеся» с пробела. Уберем их, включив пробел в диапазон в квадратных скобках:
Проверить формат телефонного номера
Номер должен быть длиной 10 знаков и начинаться с 8 или 9. Есть список телефонных номеров, и нужно проверить их, используя регулярки в Python:
Разбить строку по нескольким разделителям
Также мы можем использовать метод re.sub() для замены всех разделителей пробелами:
Извлечь информацию из html-файла
Пример содержимого html-файла:
С помощью регулярных выражений в Python это можно решить так (если поместить содержимое файла в переменную test_str ):
Применение регулярных выражений в Python
Регулярные выражения можно определить как последовательность символов, которые используются для поиска шаблона в строке. Модуль re обеспечивает поддержку использования регулярных выражений в программе Python. Модуль re выдает исключение, если при использовании регулярного выражения произошла ошибка.
Чтобы использовать функции регулярных выражений в Python, необходимо импортировать модуль re.
Функции регулярных выражений
В Python используются следующие функции регулярных выражений.
Функция | Описание | |
---|---|---|
1 | match | Этот метод сопоставляет шаблон регулярного выражения в строке с необязательным флагом. Он возвращает истину, если в строке найдено совпадение, в противном случае возвращает ложь. |
2 | search | Этот метод возвращает объект соответствия, если в строке найдено совпадение. |
3 | findall | Он возвращает список, содержащий все совпадения шаблона в строке. |
4 | split | Возвращает список, в котором строка была разделена при каждом совпадении. |
5 | sub | Заменить одно или несколько совпадений в строке. |
Формирование регулярного выражения
Регулярное выражение можно сформировать, используя сочетание метасимволов, специальных последовательностей и наборов.
Метасимволы
Метасимвол – это символ с указанным значением.
Метасимвол | Описание | Пример |
---|---|---|
[] | Представляет собой набор символов. | “[[a-z]” |
\ | Он представляет собой особую последовательность. | “\r” |
. | Сигнализирует о том, что какой-либо символ присутствует в определенном месте. | “Ja.v.” |
^ | Он представляет собой образец, присутствующий в начале строки. | «^ Java» |
$ | Присутствует в конце строки. | “point” |
* | Представляет собой ноль или более вхождений шаблона в строку. | “hello*” |
+ | Он представляет собой одно или несколько вхождений шаблона в строку. | “hello+” |
<> | Указанное количество вхождений шаблона в строку. | “java<2>” |
| | Он представляет собой присутствие того или иного символа. | “java|point” |
() | Объединение и группировка. |
Особые последовательности
Специальные последовательности – это последовательности, которые содержат (либо за которыми следует) один из символов.
Символ | Описание |
---|---|
\A | Он возвращает совпадение, если указанные символы присутствуют в начале строки. |
\b | Возвращает совпадение, если указанные символы присутствуют в начале или в конце строки. |
\B | Он возвращает совпадение, если символы присутствуют в начале строки, но не в конце. |
\d | Возвращает совпадение, если строка содержит цифры 4. |
\D | Строка не содержит цифр 9. |
\s | Строка содержит какой-либо символ пробела. |
\S | Строка не содержит пробелов. |
\w | Строка содержит какие-либо символы слова. |
\W | Строка не содержит ни одного слова. |
\Z | Возвращает совпадение, если указанные символы находятся в конце строки. |
Наборы
Набор – это группа символов, заключенная в квадратные скобки. Он представляет особый смысл.
Набор | Описание | |
---|---|---|
1 | [arn] | Возвращает совпадение, если строка содержит любой из указанных символов в наборе. |
2 | [an] | Возвращает совпадение, если строка содержит любой из символов от a до n. |
3 | [^ arn] | Строка содержит символы, кроме a, r и n. |
4 | [0123] | Строка содержит любую из указанных цифр. |
5 | 5 | Строка содержит любую цифру от 0 до 9. |
6 | 5 1 | Строка содержит любую цифру от 00 до 59. |
10 | [a-zA-Z] | Возвращает совпадение, если строка содержит буквы алфавита(в нижнем или верхнем регистре). |
Функция findall()
Этот метод возвращает список, содержащий все совпадения шаблона в строке. Он возвращает шаблоны в том порядке, в котором они были найдены. Если совпадений нет, возвращается пустой список.
Рассмотрим следующий пример:
Объект соответствия
Объект соответствия содержит информацию о поиске и выводе. Если совпадений не найдено, возвращается объект None.
Методы объекта Match
С объектом Match связаны следующие методы.