{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import re" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# найдем идентификаторы пользователей в тексте\n", "msg = 'В розыгрыше победили: id1234563, id4653, id46!'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "re.findall(r'id\\d+', msg)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ПРАКТИКА. Найдем хэштеги в твите\n", "tweet = 'когда #эпидемия, то обязательно #оставайсядома'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# посмотрим внимательнее, как работают quantifiers\n", "text = \"\"\"Что такое регулярные выражения и как их использовать? \n", "Говоря простым языком, регулярное выражение — это последовательность символов, используемая для поиска и замены текста в строке или файле. Как уже было упомянуто,\\\n", "их поддерживает множество языков общего назначения: Python, Perl, R.\n", "Так что изучение регулярных выражений рано или поздно пригодится.\"\"\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "re.findall(r'\\w+', text)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "re.findall(r'\\w*', text)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "re.findall(r'\\w?', text)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# необходимо из строки с условными датами вытащить их\n", "registration = 'Date of start: 4-12. Date of registration: 20-11'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "re.findall(r'\\d{1,2}-\\d{1,2}', registration)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# вытащим номера телефонов и текста\n", "phone_numbers = 'Мария: 8-943-342-23-32 Александр: 8-323-432-23-67'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "phone_pattern = r'\\d-\\d{3}-\\d{3}-\\d{2}-\\d{2}'\n", "re.findall(phone_pattern, phone_numbers)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# ПРАКТИКА. Свалидируем дату\n", "date = '1st september 2019 17:25'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ПРАКТИКА. Посчитаем количество лайков и репостов по всем сообщениям\n", "messages = ['Опять дождь! Лайков: 5, Репостов: 4', 'Крутой был концерт! Лайков: 28, Репостов: 22']" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# посчитаем количество восклицательных предложений в твите\n", "tweet_2 = 'Какое замечательное место! Обязательно вернусть сюда снова. Всем советую!!!'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "re.split(r'!+', tweet_2)\n", "# re.split(r'!+ ', tweet_2)\n", "# len(re.split(r'!+\\s', tweet_2))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# search ищет по всей строке, а match только в начале\n", "text = \"\"\"Что такое регулярные выражения и как их использовать? \n", "Говоря простым языком, регулярное выражение — это последовательность символов, используемая для поиска и замены текста в строке или файле. Как уже было упомянуто,\\\n", "их поддерживает множество языков общего назначения: Python, Perl, R.\n", "Так что изучение регулярных выражений рано или поздно пригодится.\"\"\"\n", "\n", "result = re.match(r'Python', text)\n", "result\n", "# print('Нашел' if result else 'Не нашел')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "re.match(r'Что', text)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "res = re.search(r'Python', text)\n", "# res.start(), res.end()\n", "# res.group()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# определим находится ли домен в зоне com\n", "domain = 'www.site.com'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "re.findall('www.+com', domain)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# поищем только в начале и конце строки\n", "history_comment = '20 век был более опасным, чем 19 век'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "re.findall(r'\\d{1,2}\\s\\век', history_comment)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "re.findall(r'^\\d{1,2}\\s\\век', history_comment)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "re.findall(r'\\d{1,2}\\s\\век$', history_comment)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# экранирование. Разделим текст по точкам\n", "text = \"\"\"Что такое регулярные выражения и как их использовать? \n", "Говоря простым языком, регулярное выражение — это последовательность символов, используемая для поиска и замены текста в строке или файле. Как уже было упомянуто,\n", "их поддерживает множество языков общего назначения: Python, Perl, R.\n", "Так что изучение регулярных выражений рано или поздно пригодится.\"\"\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "re.split(r'\\.\\s', text)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ИЛИ\n", "market_search = 'Что лучше: ноутбук или компьютер?'\n", "re.findall('ноутбук|компьютер', market_search)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# [] - найдем слово во всем склонениях\n", "text = \"\"\"Что такое регулярные выражения и как их использовать? \n", "Говоря простым языком, регулярное выражение — это последовательность символов, используемая для поиска и замены текста в строке или файле. Как уже было упомянуто,\n", "их поддерживает множество языков общего назначения: Python, Perl, R.\n", "Так что изучение регулярных выражений рано или поздно пригодится.\"\"\"\n", "pattern = 'регулярн[а-я]+ выражен[а-я]+'\n", "re.findall(pattern, text)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "websites = 'www.101.com www.google.com'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "re.findall(r'www[^0-9]+com', websites)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ПРАКТИКА. Разделим текст по запятой и по точкам\n", "tweet_23 = 'Какое замечательное место! Обязательно вернусть сюда снова. Всем советую!!!'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ПРАКТИКА. Напишите регулярку, которая отберет только валидный пароль по критериям:\n", "# - содержит латинские символы в верхнем и нижнем регистре;\n", "# - содержит числа;\n", "# - содержит символы из *, #, $, %, !, &, .;\n", "# - от 8 до 20 символов в длину;\n", "passwords = ['Apple34!rose', 'My87hou#4$', 'abc123']" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "regex_pass = r''\n", "for password in passwords:\n", " if re.match(regex_pass, password):\n", " print('The password {} is a valid password'.format(password))\n", " else:\n", " print('The password {} is invalid'.format(password)) " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# произведем замену на regex\n", "re.sub(r'регулярн[а-я]+ выражен[а-я]+', 'regex', text)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# скобочные группы\n", "# выделим группы символов из посадочного талона, где:\n", "# - первые 2 символа - это авиакомпания;\n", "# - 4 следующие символа - номер рейса;\n", "# - 3 следующих символа - аэропорт отправления;\n", "# - 3 следюущих - аэропорт прибытия;\n", "# - оставшиеся - дата рейса\n", "# Все буквы всегда в верхнем регистре" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "flight = 'Boarding pass: LA4214 AER-CDB 06NOV'" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "flight = 'Boarding pass: LA4214 AER-CDB 06NOV'\n", "regex_flight = r'([A-Z]{2})(\\d{4})\\s([A-Z]{3})-([A-Z]{3})\\s(\\d{2}[A-Z]{3})'" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "flight_result = re.findall(regex_flight, flight)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[('LA', '4214', 'AER', 'CDB', '06NOV')]\n" ] } ], "source": [ "print(flight_result)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "flight_match_result = re.search(regex_flight, flight)\n", "print(flight_match_result.group(2))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# квантификатор внутри группы и после нее – это совершенно разные вещи!\n", "numbers = 'Мои счастливые числа 777 и 5534'\n", "re.findall(r'\\d+', numbers)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "re.findall(r'(\\d)+', numbers)\n", "# так происходит, потому что эти цифры последовательно повторяются 1 и более раз" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# переведем даты к другому формату при помощи групп\n", "date = '08/30/1991'\n", "re.sub(r'(\\d\\d)/(\\d\\d)/(\\d{4})', r'\\2.\\1.\\3', date)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# удалим повторяющиеся числа\n", "numbers = '44444 6666 8888'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "re.sub(r'(\\d)+', r'\\1', numbers)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#non-captureing groups\n", "# попробуем достать оценочные слова, которые стоят перед \"фильм, кино\"\n", "review = 'Мне очень понравился этот фильм! Понравилось еще расположение кинотеатра, очень удобное!!!'\n", "regex_negative = r'(понравился|понравилось).+(?:фильм|кино).+'\n", "negative_matches = re.findall(regex_negative, review)\n", "negative_matches" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# lookaround. Достанем имена только загруженных файлов\n", "report = 'файл 11.txt загружен, файл 22.txt загружен, файл 33.txt ошибка'\n", "find_downloaded = r'\\d+\\.txt(?=\\sзагружен)'\n", "files_error = r'\\d+\\.txt(?!\\sзагружен)'\n", "re.findall(find_downloaded, report)\n", "re.findall(files_error, report)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# ПРАКТИКА. Получить только рублевые цены\n", "prices = 'RUB4.44, RUB10.88, EUR0.99, RUB99.99'" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 2 }