# Сегодня поговорим про некоторые полезные модули в стандартной библиотеке
import re # regular expression - библиотека регулярных выражений
f = open("pushkin.txt") # Этот файл есть на моем компьютере; на вашем - нет
text = f.read()
f.close()
text
'Я помню чудное мгновенье:\nПередо мной явилась ты,\nКак мимолетное виденье,\nКак гений чистой красоты.\n\nВ томленьях грусти безнадежной,\nВ тревогах шумной суеты,\nЗвучал мне долго голос нежный\nИ снились милые черты.\n\nШли годы. Бурь порыв мятежный\nРассеял прежние мечты,\nИ я забыл твой голос нежный,\nТвои небесные черты.\n\nВ глуши, во мраке заточенья\nТянулись тихо дни мои\nБез божества, без вдохновенья,\nБез слез, без жизни, без любви.\n\nДуше настало пробужденье:\nИ вот опять явилась ты,\nКак мимолетное виденье,\nКак гений чистой красоты.\n\nИ сердце бьется в упоенье,\nИ для него воскресли вновь\nИ божество, и вдохновенье,\nИ жизнь, и слезы, и любовь.\n'
for line in text.splitlines():
print(line)
Я помню чудное мгновенье: Передо мной явилась ты, Как мимолетное виденье, Как гений чистой красоты. В томленьях грусти безнадежной, В тревогах шумной суеты, Звучал мне долго голос нежный И снились милые черты. Шли годы. Бурь порыв мятежный Рассеял прежние мечты, И я забыл твой голос нежный, Твои небесные черты. В глуши, во мраке заточенья Тянулись тихо дни мои Без божества, без вдохновенья, Без слез, без жизни, без любви. Душе настало пробужденье: И вот опять явилась ты, Как мимолетное виденье, Как гений чистой красоты. И сердце бьется в упоенье, И для него воскресли вновь И божество, и вдохновенье, И жизнь, и слезы, и любовь.
# Обычный поиск подстроки
text.find("нье")
21
# Попробуем теперь найти все слова по шаблону
re.findall("[А-Яа-я]*нье", text) # любое сочетание русских букв + "нье"
['мгновенье', 'виденье', 'пробужденье', 'виденье', 'упоенье', 'вдохновенье']
# Поищем что-нибудь поинтереснее. Например, на страницах в интернете
import urllib.request
# Открываем главную страницу ВШЭ
response = urllib.request.urlopen("http://hse.ru")
# И читаем HTML-содержимое, декодируя его из кодировки utf-8
text = response.read().decode("utf-8")
len(text)
347156
# Вот что там записано в начале. Это HTML
text[:1000]
'<!DOCTYPE html>\n<!-- (c) Art. Lebedev Studio | http://www.artlebedev.com/ -->\n<html xmlns:perl="urn:perl"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=Edge"><link rel="image_src" href="http://www.hse.ru/f/src/global/i/hse.png"><link rel="icon" href="/favicon.ico" type="image/x-icon"><!--[if lt IE 10]><script src="/f/src/global/bower_components/es5-shim/es5-shim.min.js"></script><![endif]--><link rel="stylesheet" href="/f/src/global/css/main.css?v2" media="all"><style>.post__extra_rt {display: none;} .post_first .splash__text {color: white; margin: 2.5em 2em 2.5em 4.7em;} .post_first .splash.splash_self {background-size: 120% auto; background-position:64% 53%;padding: 2em 0;} .post_first .splash.splash_self:hover {background-size: 130% auto;} .post_first .splash__text p + p {margin-top: 0em;} /* Общие стили */ .splash__text { margin: 3em 4em 3em 75px; }</style><style>.splash.fdp.pseudo { color: white; backgro'
# Попробуем теперь на этой странице найти все гиперссылки.
# Они выглядят примерно так: <a href="адрес ссылки"> текст подписи ссылки </a>
# Используем здесь апострофы, чтобы кавычки внутри не пришлось экранировать
res = re.findall('<a href="[^"]+">[^<]*</a>', text)
for item in res:
print(item)
<a href="http://forum.hse.ru/newforum/index.php?t=thread&frm_id=87&S=e36a456f132336af8c64dd2943040f5c">Отвечает проректор Вячеслав Башев.</a> <a href="http://family.hse.ru/">ВышкаFamily</a> <a href="http://www.hse.ru/buildinghse">Карта зданий</a> <a href="mailto:abitur@hse.ru">abitur@hse.ru</a> <a href="mailto:press@hse.ru">press@hse.ru</a> <a href="http://hselab.ru/news/hakaton-hack-people-hardware-internet-things">«Hack For People»</a> <a href="http://philology.hse.ru/announcements/159486013.html">«Социальные практики литературы: роль институтов в истории русской литературы»</a> <a href="http://oriental.hse.ru/syo/news/157264701.html">Школу юного востоковеда</a> <a href="http://social.hse.ru/psy/sjp/">Школу юного психолога</a> <a href="http://iims.hse.ru/csid/announcements/160297840.html">Международного центра изучения институтов и развития для молодых исследователей</a> <a href="/news/159292440.html">«Innovation in Business and Management: Future Global Challenge»</a> <a href="http://www.hse.ru/ba/gmu/announcements/140151864.html">«Социология» и «Государственное и муниципальное управление»</a> <a href="http://social.hse.ru/psy/sjp/">Школу юного психолога</a> <a href="http://iims.hse.ru/csid/announcements/160297840.html">Международного центра изучения институтов и развития для молодых исследователей</a> <a href="/news/159292440.html">«Innovation in Business and Management: Future Global Challenge»</a> <a href="/contacts.html">Адреса и контакты</a> <a href="/copyright">Условия использования материалов</a> <a href="http://www.hse.ru/sitemap.html">Карта сайта</a>
# Выделим отдельно ссылку и текст с помощью скобок
# Тогда мы получим пары
res = re.findall('<a href="([^"]+)">([^<]*)</a>', text)
for item in res:
print(item)
('http://forum.hse.ru/newforum/index.php?t=thread&frm_id=87&S=e36a456f132336af8c64dd2943040f5c', 'Отвечает проректор Вячеслав Башев.') ('http://family.hse.ru/', 'ВышкаFamily') ('http://www.hse.ru/buildinghse', 'Карта зданий') ('mailto:abitur@hse.ru', 'abitur@hse.ru') ('mailto:press@hse.ru', 'press@hse.ru') ('http://hselab.ru/news/hakaton-hack-people-hardware-internet-things', '«Hack For People»') ('http://philology.hse.ru/announcements/159486013.html', '«Социальные практики литературы: роль институтов в истории русской литературы»') ('http://oriental.hse.ru/syo/news/157264701.html', 'Школу юного востоковеда') ('http://social.hse.ru/psy/sjp/', 'Школу юного психолога') ('http://iims.hse.ru/csid/announcements/160297840.html', 'Международного центра изучения институтов и развития для молодых исследователей') ('/news/159292440.html', '«Innovation in Business and Management: Future Global Challenge»') ('http://www.hse.ru/ba/gmu/announcements/140151864.html', '«Социология» и «Государственное и муниципальное управление»') ('http://social.hse.ru/psy/sjp/', 'Школу юного психолога') ('http://iims.hse.ru/csid/announcements/160297840.html', 'Международного центра изучения институтов и развития для молодых исследователей') ('/news/159292440.html', '«Innovation in Business and Management: Future Global Challenge»') ('/contacts.html', 'Адреса и контакты') ('/copyright', 'Условия использования материалов') ('http://www.hse.ru/sitemap.html', 'Карта сайта')
# Тут встречаются e-mail адреса. Уберем их:
res = re.findall('<a href="([^@"]+)">([^<]*)</a>', text)
for item in res:
print(item)
('http://forum.hse.ru/newforum/index.php?t=thread&frm_id=87&S=e36a456f132336af8c64dd2943040f5c', 'Отвечает проректор Вячеслав Башев.') ('http://family.hse.ru/', 'ВышкаFamily') ('http://www.hse.ru/buildinghse', 'Карта зданий') ('http://hselab.ru/news/hakaton-hack-people-hardware-internet-things', '«Hack For People»') ('http://philology.hse.ru/announcements/159486013.html', '«Социальные практики литературы: роль институтов в истории русской литературы»') ('http://oriental.hse.ru/syo/news/157264701.html', 'Школу юного востоковеда') ('http://social.hse.ru/psy/sjp/', 'Школу юного психолога') ('http://iims.hse.ru/csid/announcements/160297840.html', 'Международного центра изучения институтов и развития для молодых исследователей') ('/news/159292440.html', '«Innovation in Business and Management: Future Global Challenge»') ('http://www.hse.ru/ba/gmu/announcements/140151864.html', '«Социология» и «Государственное и муниципальное управление»') ('http://social.hse.ru/psy/sjp/', 'Школу юного психолога') ('http://iims.hse.ru/csid/announcements/160297840.html', 'Международного центра изучения институтов и развития для молодых исследователей') ('/news/159292440.html', '«Innovation in Business and Management: Future Global Challenge»') ('/contacts.html', 'Адреса и контакты') ('/copyright', 'Условия использования материалов') ('http://www.hse.ru/sitemap.html', 'Карта сайта')
# Теперь совсем другая задача - попробуем напечатать на экране таблицу ASCII
# (а то было много вопросов про коды символов)
# Здесь сразу окончательный вариант кода
print(" |", end="")
for column in range(16):
print(" {:X} ".format(column), end="") # {:X} - шестнадцатеричный формат
print()
print("-" * 68)
for row in range(2, 8):
print(row, end=" |")
for column in range(16):
code = 16 * row + column
print(" {} ".format(chr(code)), end="")
print()
| 0 1 2 3 4 5 6 7 8 9 A B C D E F -------------------------------------------------------------------- 2 | ! " # $ % & ' ( ) * + , - . / 3 | 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 4 | @ A B C D E F G H I J K L M N O 5 | P Q R S T U V W X Y Z [ \ ] ^ _ 6 | ` a b c d e f g h i j k l m n o 7 | p q r s t u v w x y z { | } ~
# Вообще функция format работает так:
data = ("Alexey", 123, 3.14)
print("Hello, {0}! {0}, please, compare {2} and {1}!".format(*data))
# Вопрос из зала про оператор % для форматирования строк
# Вот как это можно было сделать по-старому:
print("Hello, %s! %s, please, compare %.2f and %d!" % ("Alexey", "Alexey", 3.14, 123))
# Но функция format гибче - например, она позволяет повторять аргументы или менять их порядок
Hello, Alexey! Alexey, please, compare 3.14 and 123! Hello, Alexey! Alexey, please, compare 3.14 and 123!
# В оставшееся время поиграем немного с датами и временем
import datetime
now = datetime.date.today()
now
datetime.date(2015, 9, 25)
birth = datetime.date(1997, 8, 8)
diff = now - birth
diff.days
6622
diff.total_seconds()
572140800.0
# Вопрос из зала: почему так много секунд?
# Проверим, переведя их в годы:
diff.total_seconds() // 60 // 60 // 24 // 365
18.0
# В эпохе Unix секунды отсчитываются от 1 января 1970 года.
# Когда исчерпаются 4 байта для хранения этих секунд?
datetime.datetime.fromtimestamp(2**31 - 1).isoformat()
'2038-01-19T06:14:07'