Как разобрать слово по составу дней: «дней» — корень слова, разбор по составу (морфемный разбор слова)

годовщина со дня образования Союза

В декабре 2022 года Советскому Союзу исполнится 100 лет. Мировая держава пережила на своем веку несколько крупных войн и политическую битву с другим мировым гегемоном — США. Как появился СССР и почему коммунистический союз так быстро развалился — читайте в материале «Вечерней Москвы».

Когда СССР исполняется 100 лет?

30 декабря 2022 года исполнится ровно 100 лет со дня основания Советского Союза. Он объединял в себе 15 социалистических республик: Российская, Украинская, Белорусская, Узбекская, Казахская, Грузинская, Азербайджанская, Литовская, Молдавская, Латвийская, Киргизская, Таджикская, Армянская, Туркменская и Эстонская.

После развала советского государства правопреемницей страны стала Российская Федерация. Будучи продолжателем территориальных и имущественных прав РСФСР, она одновременно является продолжателем Советского Союза в рамках выполнения обязательств по заключенным ранее двусторонним и многосторонним договорам.

Когда и кем был основан СССР?

Официальная дата создания СССР — 30 декабря 1922 года. Это произошло после объединения Российской СФСР с Украинской, Белорусской ССР и Закавказской СФСР.

Идея советского государства была основана на теории марксизма-ленинизма (идеология на основе учений Владимира Ленина и Карла Маркса), которая связана с законами борьбы за свержение капиталистического строя и построение коммунистического общества. Главными ее представителями в начале XX века для СССР являлись Иосиф Сталин, Владимир Ленин и Лев Троцкий.

Социалистический строй стал надеждой для простого народа, в то время как Российская империя претерпевала не лучшие времена. Так, внутренний кризис империи и Первая мировая война стали катализаторами появления Советского Союза. Однако есть и другие причины, по которым СССР появился на карте мира.

— Внешнеполитические.

Партия большевиков стремилась распространить свою власть на как можно большую территорию, какую могла охватить.

— Экономические.

Подорванная Гражданской войной экономика вела Россию к голоду. Ей нужна была поддержка союзных республик.

— Территориальные.

Во время поставок продовольствия необходимо было свободно перемещаться. Единое государство для этого создавало оптимальные условия. Всю огромную территорию связывала единая железнодорожная сеть.

— Культурные.

Несмотря на разные корни, народности длительное время жили вместе, и это привело к формированию некоторых общих традиций.

— Политические.

Правительственный аппарат союзных республик, который состоял из большевиков, жестко подчинялся центральной власти.

Но идея создания социалистического государства была не всем по нраву — в каждой из республик переход в состав СССР был воспринят по-разному.

Например, Закавказская Социалистическая Федеративная Советская Республика (ЗСФСР) пережила немалое количество войн — как внутренних, так и внешних — перед входом в Советский Союз. Националистические движения, поднятые в республиках (ныне Азербайджан, Армения и Грузия — прим. «ВМ»), не давали возможности спокойно войти в состав новообразованного государства. Кроме того, каждая из стран пережила кратковременную независимость от Российской империи, которая в силу слабых экономических возможностей не могла долго продержаться.

Помимо этого, националистические волны на Украине мешали «объединиться всем пролетариям». На территории страны проходили ожесточенные бои между бежавшими белогвардейцами и коммунистами. Около двух лет продолжалась Гражданская война между Украинской народной республикой (УНР) и УССР, которая завершилась лишь к лету 1919 года после заключения договора с РСФСР об установлении военного и хозяйственного союза.

Когда СССР перестал существовать?

История развала советского государства началась задолго до августовских событий 1991 года. Советский строй просуществовал без трех дней 69 лет. Последним и единственным президентом СССР был Михаил Горбачев. 25 декабря 1991 года он в телеобращении к народу объявил о прекращении своей деятельности на посту главы государства и подписал указ о передаче управления стратегическим ядерным оружием президенту России Борису Ельцину.

Горбачев в сентябре 2021 года в интервью газете The Times заявил, что в случае сохранения Советского Союза мир был бы лучше. Развал СССР, по словам Горбачева, произошел из-за сепаратистов и радикалов, которые «добили» Союз после неудачного августовского путча 1991 года. «Вечерняя Москва» в беседе с экспертом решила выяснить, почему развалился СССР и как исчезновение советского государства повлияло на мир.

Причины развала

По словам политолога, заместителя директора Института истории и политики МПГУ, кандидата исторических наук Владимира Шаповалова, существовал ряд причин, повлиявших на распад Советского Союза.

— Прежде всего, необходимо отметить, что Советский Союз имеет чрезвычайно серьезные и великие победы: победа в Великой Отечественной войне (ВОВ), покорение космоса, достижения в науке и промышленности, ликвидация безграмотности, освоение и развитие территорий, реализация принципа социальной справедливости. В то же самое время СССР не являлся идеальным государством и обществом, он имел свой ряд достаточно серьезных и уязвимых элементов, — пояснил он.

В первую очередь эксперт отметил догматизм советской идеологии, создававший достаточно узкий коридор для развития общества. Также нескончаемое противостояние с западными странами имело сильное влияние на экономику государства.

— Экономическое противостояние и гонка вооружений с США шли при условии, что советская территория была в значительной степени разорена в годы Великой Отечественной войны. СССР потребовалось приложить колоссальные усилия для того, чтобы эти территории восстановить. Эти усилия нужно было сочетать с необходимостью поддерживать баланс сил в гонке вооружений с куда более мощной экономикой США и их сателлитов, — сказал Шаповалов.

При этом американская экономика, по словам специалиста, в то время не испытывала таких сложностей. Такое противостояние между странами негативно повлияло на всю страну — в частности, это привело к дальнейшим ошибкам в развитии плановой экономики, к падению цен на нефть и к ряду других экономических проблем.

Как развал СССР повлиял на мир

Шаповалов напомнил слова президента России Владимира Путина, который назвал развал СССР «крупнейшей геополитической катастрофой века». По мнению историка, распад такого крупного государства негативно сказался на всем мировом сообществе.

— Во-первых, США и их агрессивные устремления некому больше было сдерживать — настала эра «мира по-американски». И результатом этого мира стали бомбардировки Белграда, уничтожение целых государств, огромные жертвы среди мирного населения в странах Азии, Африки и Европы. Это все следствие того, что американскому бандиту больше не было возможности противостоять, поскольку баланс сил был разрушен, — разъяснил эксперт.

Разрушение баланса сил в свою очередь привело к росту нестабильности во всем мире. Историк отметил, что в странах Латинской Америки и Африки участились конфликты. По словам специалиста, буквально во всем мире возник целый ряд угроз в лице международного терроризма.

Помимо этого, развал Советского Союза повлиял на распространение идей «дикого рынка» — иными словами, к существенной дискредитации левых идей и социальной справедливости, уточнил Шаповалов.

— Также распад СССР привел к доминированию в общественном дискурсе примитивных либертарианских экономических идей, основанных на том, что невидимая рука рынка расставит все по своим местам. Советская социальная политика до распада государства была частью западного сообщества. Социальные гарантии были вписаны во многие конституции западных стран, но распад советского государства привел к тому, что эти идеи оказались отброшены, — резюмировал эксперт.

Кто в 2022-м предлагает праздновать годовщину?

Первый заместитель председателя ЦК КПРФ Юрий Афонин 6 декабря предложил сделать общенациональным праздником 100-летие со дня основания СССР.

— Мы считаем, что празднование 100-летия СССР должно стать общегосударственным делом. Еще не поздно придать великому историческому юбилею государственное звучание. Мы призываем вас принять активное участие в этих мероприятиях. Мы призываем все российские СМИ, особенно государственные, широко осветить эти события, — отметил он.

Также парламентарий рассказал, в чем цель празднования такого юбилея.

— Наша цель — не только отдать дань нашей великой истории, но и позаботиться о будущем. Исторические обстоятельства властно требуют от нас начать учиться у СССР, — заключил Афонин.

Официальный представитель Кремля Дмитрий Песков 8 декабря высказался касательно празднования столетия СССР. По его словам, в аппарате президента России считают образование Советского Союза важной частью российской истории, однако праздновать юбилей государства там не планируют. Он также отметил, что СССР — это «важная, неотъемлемая часть российской истории».

Какие мероприятия к этой дате пройдут?

Выставки:

«Новый человек: между утопией и традициями. К 100-летию образования СССР»

18 октября в Российском этнографическом музее начала работу выставка «Новый человек: между утопией и традициями. К 100-летию образования СССР». Экспозиция посвящена этнокультурным аспектам советского проекта формирования «нового человека». Она продлится вплоть до 31 декабря.

«Карты Советского Союза. К 100-летию образования СССР»

1 декабря прошло открытие выставки в Библиотеке имени Ленина «Карты Советского Союза. К 100-летию образования СССР».

Эта экспозиция — уникальная возможность увидеть редкие малотиражные карты 1920–1930 годов и образцы картопроизводства периода расцвета СССР, а также изучить опыт использования картографических материалов для продвижения идеологии и формирования общественного мнения. Выставка продлится вплоть до 31 января 2023 года.

К 100-летию образования СССР: «Чичерин и советская дипломатия»

В выставочном зале Патриаршего дворца с октября проходит выставка, приуроченная к двум знаковым юбилейным датам — 100-летию образования СССР и 150-летию со дня рождения дипломата, первого народного комиссара по иностранным делам СССР Георгия Чичерина.

Центральное место в экспозиции отведено историческим раритетам из собрания Музеев Московского Кремля — красноармейской военной форме и подаркам зарубежных делегаций, принадлежность которых легендарному наркому удалось установить в результате недавних исследований. Она продлится вплоть до 8 января 2023 года.

Концерты:

Гала-концерт «Сто лет СССР»

В концертном зале «Москва» 17 декабря прошел гала-концерт, приуроченный к дате образования СССР. В нем приняли участие представители России и бывших союзных республик: эстрадные певцы, солисты оперы, балета и хореографические коллективы.

Конференции и форумы:

Конференция «СССР как попытка построения новой коммунистической цивилизации»

В Институте мировых цивилизаций 22 декабря состоится международная научно-практическая конференция «СССР как попытка построения новой коммунистической цивилизации».

Кинофорум «Друга я никогда не забуду, если с ним подружился в Москве»

В этом году стартовал кинофорум «Друга я никогда не забуду, если с ним подружился в Москве», который призван положительно повлиять на решение межнациональных и социальных проблем современного общества.

Также людям расскажут об их истории и корнях. Помимо этого, им продемонстрируют интересные архивные фильмы, в том числе малоизвестные и ранее запрещенные, созданные на разных киностудиях интернациональными командами с целью возродить в обществе идею мирного сосуществования, дружбы и уважения между национальностями:

— 18 декабря в 15:00 пройдет кинопоказ фильма студии «Арменфильм» имени Амо Бек-Назарова «Здравствуй, это я!»;

— 21 декабря в 19:00 в «Москино Космос» зрители смогут насладиться опереттой киностудии «Азербайджанфильм» имени Джафара Джаббарлы «Аршин мал алан»;

— 25 декабря в 15:00 состоится кинопоказ в «Москино Молодежный», на экранах можно будет увидеть картину студии «Мосфильм» «Свинарка и пастух».

Памятные знаки и сувениры о 100-летии СССР

В честь столетнего юбилея со дня создания Советского Союза фонд «Сто лет СССР» проводит мероприятие, в ходе которого россияне могут получить одноименную медаль. Для этого им нужно подать заявку на сайте фонда, которую рассмотрят специалисты.

Интересные факты об СССР

Качественная и вкусная еда, бесплатная медицина, жизнь под лозунгом «Все для народа» — первое, что вспоминает большая часть старшего поколения, говоря о Советском Союзе. А чем еще запомнился СССР для мира?

Автомат Калашникова

«Товар на века» автомат Калашникова был создан в 1947 году Михаилом Калашниковым, он до сих пор является самым распространенным стрелковым оружием. На долю АК-47 и его модификаций приходится до 1/5 всего рынка оружия в мире.

Фото: shutterstock

По приблизительным подсчетам, в общей сложности в мире выпущено от 70 до 105 миллионов экземпляров модификаций автомата. Автомат Калашникова до сих пор применяется вооруженными силами стран Азии, Африки, Ближнего Востока и Европы.

Наука

Советский Союз был богат на различные научные открытия. Стране приходилось развиваться семимильными шагами, чтобы не отставать от мировых лидеров в разных отраслях.

СССР был известен миру своей сильной программой в ядерной энергетике.

В 1937 году был запущен первый в Европе циклотрон. Его запуск происходил в лаборатории Курчатова. В 1947 году проведено успешное испытание первой атомной бомбы на Семипалатинском полигоне.

Помимо этого, советские ученые создали: первую в мире микроволновую печь в 1941 году; первую в мире атомную электростанцию в 1954 году; самый крупный в мире самолет за всю историю авиации в 1988 году Ан-225 («Мрия») и многое другое.

Авиация

Советские авиаконструкторы достигли немалых успехов на своем поприще. Такие фамилии, как Туполев (самолеты модели «Ту»), Ильюшин («Ил»), Антонов («Ан») и Яковлев («Як»), известны всему миру.

Их работа привела к тому, что в мире появилась новая авиационная техника с реактивными двигателями: истребители МиГ-9, Як-15, бомбардировщики Ил-28 и Ту-14.

Культура

Культура советских республик была богата разными деятелями. По всему миру известны танцоры балета Анна Павлова, Галина Уланова, Владимир Васильев, Рудольф Нуриев и Майя Плисецкая. Поучиться мастерству у советских артистов было мечтой для многих иностранных хореографов. А посещение балета «Лебединое озеро» в Большом театре стало для туристов неотъемлемой частью развлекательной программы во время визита в СССР.

Также в Европе не раз слышали имя прославленного советского певца эстрады Муслима Магомаева, который в 1964–1965 годах стажировался в миланском театре «Ла Скала» (Италия). В 1960-е годы артист выступал в крупнейших городах Советского Союза, в спектаклях «Тоска» Джакомо Пуччини и «Севильский цирюльник» Джоаккино Россини (среди партнеров — Мария Биешу).

В 1960-е годы в Советском Союзе своим слогом славился поэт и музыкант Владимир Высоцкий. Для некоторых людей он запомнился автором-«антисоветчиком», поскольку он не раз покидал страну, выезжал на гастроли в Соединенные Штаты и отдыхал за рубежом. Однако сам Высоцкий никогда не думал предавать советские идеалы: «Это моя Родина, и я никогда не причиню ей вред». Он писал простым и понятным языком для народа и о народе. Его «Песня о друге» (1966 год), композиции «Я не люблю» (1968−1969), «Он не вернулся из боя» (1969) и другие остались в памяти у многих поколений.

Литература

Не менее известной за рубежом была советская литература. Одним из самых известных поэтов начала XX века в СССР был Владимир Маяковский. Культурную разность СССР можно показать с помощью советской прозы. Так, в Советском Союзе мог появиться как социалистически настроенный Максим Горький, так и противоречивый для советской «верхушки» Александр Солженицын.

После революции Максима Горького признали «главным пролетарским писателем». Пьеса «На дне», роман «Мать» и автобиографические повести «Детство», «В людях», «Мои университеты» стали известны и популярны по всему Советскому Союзу. В своих произведениях Горький сумел выразить идеи, стремления и эмоции народа в эпоху начинающейся гибели капитализма.

Антипод всей советской идеологии Александр Солженицын был известен тем, что собрал письменные и устные рассказы 257 узников ГУЛАГов. Наиболее известными его произведениями являются «Архипелаг Гулаг», «Матренин двор», «Один день Ивана Денисовича» и «Раковый корпус». В 1970 году Солженицына удостоили Нобелевской премии по литературе. До этого такую награду в области литературы в Советском Союзе получали дважды — Борис Пастернак (1958 год) и Михаил Шолохов (1965 год).

Космос

Космос — последний рубеж человечества и, должно быть, самый интересный из них. Так считали и советские ученые. Достижения Советского Союза начинают отсчет с запуска первого в мире искусственного спутника Земли «Спутника-1». Космический аппарат был успешно отправлен на орбиту 4 октября 1957 года. Западные страны восприняли такое событие как «уничтожающий удар по престижу Соединенных Штатов».

Но это был только первый успешный шаг к покорению космического пространства. Следующим значимым событием для советской космонавтики, да и для всего мира, стал момент отправки человека в космос. 12 апреля 1961 года Герой Советского Союза Юрий Гагарин стал первым человеком в мире, которому удалось покорить космическое пространство. Его полет вокруг орбиты продлился 108 минут, и этого было достаточно, чтобы закрепить за СССР первенство в космической отрасли. Уже тогда Союз был признан мировым сообществом как «космическая сверхдержава».

СССР История юбилей

Комментарии к материалу В России вырастет минимальная розничная цена на игристое вино с 2023 года | fontanka.ru

Общество

27 декабря 2022, 23:27

Вернуться к публикации
Комментарии44
Все дискуссииВернуться к публикации

Новости компаний

«Аккала — продолжение зимней сказки»

Мы с гордостью вошли в топ 10 номинации «база отдыха года» городской премии «Фонтанка.ру — Признание и Влияние» и стараемся каждый день радовать наших гостей соответствуя возложенным признанием! Аккала — это историческое скандинавское название местности, где сейчас находится посёлок Красная Долина в Ленинградской области. Первое упоминание деревни Аккала датируется 1544 годом, и это ещё не дата основания:) Из шведских переписных и поземельных книг известно, что в то время здесь уже были налогооблагаемые крестьянские имения (Юхо и Хейкки…

МегаФон приобрел российского производителя программного обеспечения oneFactor

МегаФон завершил сделку по покупке компании oneFactor, специализирующейся на разработке аналитических платформ на базе искусственного интеллекта. Сделка позволит оператору усилить экспертизу в области bigdata и предлагать новые решения для абонентов и бизнеса. МегаФон — один из крупнейших поставщиков аналитических решений на российском рынке. За последние три года за счет разработки новых сервисов и расширения продуктового портфеля этот сегмент бизнеса удвоился в денежном выражении. «Рынок решений на основе больших данных растет на 40% в…

В Мурино открылся новый детский сад

19 декабря состоялось официальное открытие муниципального детского сада комбинированного вида в жилом комплексе «Цвета Радуги» в г. Мурино Дошкольное образовательное учреждение на 100 мест введено в эксплуатацию вместе с 7-м корпусом жилого комплекса «Цвета Радуги» — масштабного проекта, полностью реализованного строительной компанией «МАВИС» в этом году. Детский сад рассчитан на 4 группы по 25 детей до 6 лет, включая ясельную группу, в которую берут малышей с 2 лет. На данный момент учреждение уже работает — малыши проходят адаптационный…

ТОП 5

1

Сербская армия приведена в боевую готовность. Президент отдал приказ

60 926

352

Хлеб-соль и мундиры. Аэропорт Левашово открыт, смотрите первые фотографии

56 317

623

В Петербурге после реконструкции открылся аэродром в Левашово, но обещание Валентины Матвиенко продолжает работать

51 238

484

Тринадцать самолетов «Аэрофлота» арестовали за границей

44 219

265

Невский перекрыт, на Дворцовый мост не пускают. В центре «бордовые» пробки

44 066

41

python — преобразовать строку даты в день недели

спросил

Изменено 4 года, 11 месяцев назад

Просмотрено 99 тысяч раз

У меня есть такие строки даты:

 '11 января 2010'
 

и мне нужна функция, которая возвращает день недели, например

 'пн' или 'понедельник'
 

и т.д. Я не могу найти это нигде в справке Python. Кто-нибудь? Спасибо.

  • питон
  • дата и время

1

Возможно, вы захотите использовать методы strptime и strftime из datetime :

 >>> import datetime
>>> datetime. datetime.strptime('11 января 2010 г.', '%B %d, %Y').strftime('%A')
'Понедельник'
 

или за 'Пн' :

 >>> datetime.datetime.strptime('11 января 2010 г.', '%B %d, %Y').strftime('%a')
'пн'
 

использовать date.weekday() Возвращает день недели в виде целого числа, где понедельник — 0, а воскресенье — 6.

http://docs.python.org/2/library/datetime.html#datetime.date.weekday

можно использовать синтаксический анализатор, например dateutil.

И код для исходного вопроса:

 >>> из парсера импорта dateutil
>>> parser.parse('11 января 2010').strftime("%a")
'пн'
>>> parser.parse('11 января 2010').strftime("%A")
'Понедельник'
 

Я думаю, что самый быстрый способ сделать это, как показано ниже:

 df[Date_Column].dt.weekday_name
 
 >>> время импорта
>>> dateStr = '11 января 2010 г.'
>>> timestamp = time.strptime(dateStr, '%B %d, %Y')
>>> метка времени
time.struct_time(tm_year=2010, tm_mon=1, tm_mday=11, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=11, tm_isdst=-1)
 
 время импорта
time. strftime('%A')
 

0

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Как я могу анализировать временные интервалы произвольного текста в Python, начиная от лет и заканчивая секундами?

Это можно сделать с помощью внешней библиотеки синтаксического анализа или встроенного модуля re .

Внешняя библиотека синтаксического анализа

Мы можем написать парсер. Не имеет большого значения, какой парсер используется. Я искал « python parser » и выбрал lark , потому что он появился в верхней части результатов поиска.

Сначала я определил единицы как сопоставление. Здесь можно добавить больше единиц, если нужны «века» или «микросекунды».

Примечание. Для очень маленьких или больших чисел имейте в виду timedelta.resolution

 unit = {
    «секунда»: дельта времени (секунды = 1),
    «минута»: timedelta (минуты = 1),
    «час»: дельта времени (часы = 1),
    «день»: дельта времени (дни = 1),
    «неделя»: timedelta (недели = 1),
    «месяц»: timedelta (дни = 30),
    «год»: timedelta (дни = 365),
}
 

Затем грамматика определяется с использованием

lark варианта EBNF. Здесь WS , мы надеемся, соответствует всем пробелам:

 time_interval_grammar = r"""
%import common. WS
%import common.NUMBER
?интервал: время+
время: единица измерения _separator?
значение: ЧИСЛО -> число
единица измерения: ВТОРАЯ
    | МИНУТА
    | ЧАС
    | ДЕНЬ
    | НЕДЕЛЮ
    | МЕСЯЦ
    | ГОД
_separator: (WS | ",")+
ВТОРОЙ: /s\w*/i
МИНУТА: /mi\w*/i
ЧАС: /ч\ч*/я
ДЕНЬ: /д\н*/я
НЕДЕЛЯ: /н\н*/я
МЕСЯЦ: /mo\w*/i
ГОД: /г\ш*/я
%игнорировать WS
%игнорировать ","
"""
 

Грамматика должна позволять связывать произвольные интервалы времени вместе, с запятыми или без них в качестве разделителей.

Единицей измерения каждого временного интервала может быть кратчайший уникальный префикс:

 секунды -> с
минута -> мили
час -> ч
день -> д
неделя -> ж
месяц -> мес
год -> г
 

Включая те, что в исходном вопросе, они будут служить целевыми примерами, которые мы хотим разобрать:

 1 секунда
2 минуты
3 часа
4 дня
5 недель
6 месяцев
7 лет
1 месяц, 7 лет, 2 дня, 30 часов, 0,05 секунды
0,0003 года, 100000 секунд
3 года 4 месяца 9мин 6д
1мес,3д 1.3e2 часа, 0.04года 2ми444
 

Наконец, я следовал одному из руководств lark и использовал преобразователь:

 class IntervalToTimedelta(Transformer):
    интервал определения (дерево: список [timedelta]) -> timedelta:
        "суммирует все дельты времени"
        вернуть уменьшить (добавить, дерево, timedelta (секунды = 0))
    def time(tree: List[Union[float, timedelta]]) -> timedelta:
        "возвращает временную дельту, представляющую "
        вернуть муль(*дерево)
    блок определения (токены: список [токен]) -> timedelta:
        """
        преобразует единицу измерения в timedelta, представляющую 1 единицу измерения
        """
        возвращаемые единицы[токены[0].
type.lower()] номер определения (токены: список [токен]) -> плавать: "возвращает значение как тип Python" вернуть поплавок (токены [0]. значение)

Грамматика интерпретируется жаворонком.Жаворонок . Поскольку он совместим с lark парсер LALR(1), этот парсер указан для увеличения скорости и повысить эффективность памяти, позволяя использовать трансформатор непосредственно парсер:

 time_interval_parser = Lark(
    грамматика = time_interval_grammar,
    начало = "интервал",
    парсер="лалр",
    трансформатор = IntervalToTimedelta,
)
 

Создает практически рабочий синтаксический анализатор. Полный answer.py файл это:

 """
Пример парсинга даты и временного интервала с помощью lark
"""
из datetime импортировать timedelta
из functools импортировать уменьшить
от оператора import add, mul
от ввода списка импорта, союза
from lark import Жаворонок, Жетон, Трансформер
__все__ = [
    "Примеры",
    «ИнтервалТимедельта»,
    "разбирать",
]
примеры = список(
    фильтр(
        Никто,
        """
1 секунда
2 минуты
3 часа
4 дня
5 недель
6 месяцев
7 лет
1 месяц, 0,05 недели
0.
003г, 100000сек 3 года 4 месяца 9 минут 6 дней 1мес,3д 1,3е2 часа, 0,04 года 2миасдф """.splitlines(), ) ) единицы = { «секунда»: дельта времени (секунды = 1), «минута»: timedelta (минуты = 1), «час»: дельта времени (часы = 1), «день»: дельта времени (дни = 1), «неделя»: timedelta (недели = 1), «месяц»: timedelta (дни = 30), «год»: timedelta (дни = 365), } time_interval_grammar = г""" %import common.WS %import common.NUMBER ?интервал: время+ время: единица измерения _separator? значение: ЧИСЛО -> число единица измерения: ВТОРАЯ | МИНУТА | ЧАС | ДЕНЬ | НЕДЕЛЮ | МЕСЯЦ | ГОД _separator: (WS | ",")+ ВТОРОЙ: /s\w*/i МИНУТА: /mi\w*/i ЧАС: /ч\ч*/я ДЕНЬ: /д\н*/я НЕДЕЛЯ: /н\н*/я МЕСЯЦ: /mo\w*/i ГОД: /г\ш*/я %игнорировать WS %игнорировать "," """ класс IntervalToTimedelta (преобразователь): интервал определения (дерево: список [timedelta]) ->
timedelta: "суммирует все дельты времени" вернуть уменьшить (добавить, дерево, timedelta (секунды = 0)) def time(tree: List[Union[float, timedelta]]) -> timedelta: "возвращает временную дельту, представляющую " вернуть муль(*дерево) блок определения (токены: список [токен]) -> timedelta: """ преобразует единицу измерения в timedelta, представляющую 1 единицу измерения """ возвращаемые единицы[токены[0]. type.lower()] номер определения (токены: список [токен]) -> плавать: "возвращает значение как тип Python" вернуть поплавок (токены [0]. значение) time_interval_parser = Жаворонок( грамматика = time_interval_grammar, начало = "интервал", парсер="лалр", трансформатор = IntervalToTimedelta, ) разбор = time_interval_parser.parse если __name__ == "__main__": parsed_examples = [(пример, разбор(пример)) например в примерах] longest_example = max(map(лямбда tup: len(tup[0]), parsed_examples)) longest_formatted = max(map(lambda tup: len(f"{tup[1]!s}"), parsed_examples)) longest_parsed = max(map(lambda tup: len(f"<{tup[1]!r}>
"), parsed_examples)) например, parsed_example в parsed_examples: Распечатать( f"{пример: <{самый длинный_пример}s} -> " f"{parsed_example!s: <{самое длинное_форматированное}s} " f"{'<' + repr(parsed_example) + '>': >{longest_parsed}s}" )

Запуск запускает примеры:

 $ python .
\answer.py 1 секунда -> 0:00:01 2 минуты -> 0:02:00 3 часа -> 3:00:00 4 дня -> 4 дня, 0:00:00 5 недель -> 35 дней, 0:00:00 6 месяцев -> 180 дней, 0:00:00 7 лет -> 2555 дней, 0:00:00 1 месяц, 0,05 недели -> 30 дней, 8:24:00 0,003 года, 100000 секунд -> 2 дня, 6:03:28 3 года 4 месяца 9мин 6д -> 1221 дней, 0:09:00 1mo,3d 1.3e2 часа, -> 38 дней, 10:00:00 0,04 года 2miasdf -> 14 дней, 14:26:00

Это работает нормально, и производительность достаточна:

 $ python -m timeit -s "из ответа импортировать синтаксический анализ, примеры" "например, в примерах:" " синтаксический анализ (пример)"
500 циклов, лучшее из 5: 415 мкс на цикл
 

Потенциальные улучшения

В настоящее время здесь нет обработки ошибок, хотя это и упущено: lark вызывает ошибки, поэтому функция parse() может поймать все, что может быть изящно обходится.

Некоторые другие недостатки этой конкретной реализации:

  • Не проверяет тип с mypy --strict
  • Требуется использование сторонней библиотеки
  • Грамматика могла бы лучше формировать результирующее дерево синтаксического анализа

Встроенные регулярные выражения

В качестве альтернативы вместо использования библиотеки для синтаксического анализа можно использовать регулярные выражения со встроенным re .

Это имеет несколько недостатков:

  • Регулярные выражения сложно сделать гибкими
  • Сложные регулярные выражения трудно читать
  • Обычно человеку требуется больше времени для интерпретации регулярных выражений

Это может быть быстрее, и для этого потребуется только стандартная библиотека, включенная в CPython.

Используя предыдущий пример в качестве отправной точки, это один из способов замены регулярных выражений:

 """
Пример парсинга даты и временного интервала с re
"""
импортировать повторно
из datetime импортировать timedelta
из functools импортировать уменьшить
от оператора import add, mul
от ввода списка импорта, кортежа
__все__ = [
    "Примеры",
    "разбирать",
]
примеры = список(
    фильтр(
        Никто,
        """
1 секунда
2 минуты
3 часа
4 дня
5 недель
6 месяцев
7 лет
1 месяц, 0,05 недели
0. 003г, 100000сек
3 года 4 месяца 9мин 6д
1мес,3д 1,3е2 часа,
0,04 года 2миасдф
""".splitlines(),
    )
)
запятая = ","
вс = г"\с"
разделитель = fr"[{ws}{запятая}]+"
def unit_name(string: str) -> re.Pattern:
    вернуть re.compile(fr"{string}\w*")
второй = unit_name("s")
минута = unit_name("ми")
час = имя_единицы ("ч")
день = имя_единицы("д")
неделя = unit_name("w")
месяц = ​​unit_name("мес")
год = имя_единицы ("г")
единицы = {
    секунда: дельта времени (секунды = 1),
    минута: дельта времени (минуты = 1),
    час: дельта времени (часы = 1),
    день: дельта времени (дни = 1),
    неделя: дельта времени (недели = 1),
    месяц: timedelta(дни=30),
    год: временная дельта (дни = 365),
}
единица = перекомпилировать (
    "("
    + "|".присоединиться(
        regex.pattern для регулярного выражения в [секунда, минута, час, день, неделя, месяц, год]
    )
    + ")"
)
цифра = г"\д"
целое число = fr"({цифра}+)"
десятичное число = fr"({целое число}\.({целое число})?|\.{целое число})"
signed_integer = fr"([+-]?{integer})"
показатель степени = fr"([eE]{signed_integer})"
float_ = fr"({целое число}{показатель}|{десятичный}({показатель степени})?)"
число = перекомпилировать (fr"({float_}|{integer})")
time = re. compile(fr"(?P{number.pattern}){ws}*(?P{unit.pattern})")
interval = re.compile(fr"({time.pattern}({separator})*)+", flags=re.IGNORECASE)
def normalize_unit(text: str) -> timedelta:
    "сопоставляет единицы с их соответствующей временной дельтой"
    если не unit.match(текст):
        поднять ValueError(f"Не единица: {текст}")
    для unit_re в единицах:
        если unit_re.match(текст):
            вернуть единицы[unit_re]
    поднять ValueError(f"Подходящая единица не найдена: {текст}")
def parse(text: str) -> timedelta:
    если не interval.match(текст):
        поднять ValueError(f"Ошибка парсера: {текст}")
    parsed_pairs: List[Tuple[float, timedelta]] = list()
    для совпадения во времени.finditer(текст):
        parsed_number = число с плавающей запятой (соответствие ["число"])
        parsed_unit = normalize_unit (соответствие ["единица измерения"])
        parsed_pairs.append((parsed_number, parsed_unit))
    timedeltas = [mul(*pair) для пары в parsed_pairs]
    вернуть уменьшить (добавить, timedeltas, timedelta (секунды = 0))
если __name__ == "__main__":
    parsed_examples = [(пример, разбор(пример)) например в примерах]
    longest_example = max(map(лямбда tup: len(tup[0]), parsed_examples))
    longest_formatted = max(map(lambda tup: len(f"{tup[1]!s}"), parsed_examples))
    longest_parsed = max(map(lambda tup: len(f"<{tup[1]!r}>"), parsed_examples))
    например, parsed_example в parsed_examples:
        Распечатать(
            f"{пример: <{самый длинный_пример}s} -> "
            f"{parsed_example!s: <{самое длинное_форматированное}s} "
            f"{'<' + repr(parsed_example) + '>': >{longest_parsed}s}"
        )
 

Разбор числа имитирован из встроенных грамматических определений lark .

Производительность для этого лучше:

 $ python -m timeit -s "из answer_re импортировать синтаксический анализ, примеры" "например, в примерах:" " синтаксический анализ (пример)"
2000 циклов, лучшее из 5: 109 мкс на цикл
 

Но он менее удобочитаем, и внесение изменений для его обслуживания потребует больше работы.

Примечания

Как есть, оба примера ведут себя так, что это не совсем соответствует тому, как люди ожидают, что временные интервалы будут работать:

 >>> из разбора импорта answer_re
>>> из даты и времени импортировать дату и время
>>> datetime(2000, 1, 1) + parse("9 лет")
datetime.datetime(2008, 12, 29, 0, 0)
>>> ул(_)
'2008-12-29 00:00:00'
 

Сравните это с тем, что ожидает большинство людей:

Этот вопрос о переполнении стека предлагает несколько решений, одно из которых использует dateutil . Оба приведенных выше примера можно адаптировать, изменив отображение единиц для использования соответствующих относительная дельта с.

Вот как будет выглядеть первый пример:

 ...
единицы = {
    «секунда»: относительная дельта (секунды = 1),
    "минута": относительная дельта (минуты = 1),
    "час": относительная дельта (часы = 1),
    «день»: относительная дельта (дни = 1),
    "неделя": относительная дельта (недели = 1),
    "месяц": относительная дельта (месяцы = 1),
    "год": относительная дельта (годы = 1),
}
...
 

Это возвращает ожидаемое значение:

 >>> from answer_with_dateutil import parse
>>> из даты и времени импортировать дату и время
>>> datetime(2000, 1, 1) + parse("9годы")
datetime.datetime(2009, 1, 1, 0, 0)
>>> ул(_)
'2009-01-01 00:00:00'
 

Кроме того, использование f-строк и аннотаций типов ограничивает это Python 3.6 и выше, хотя это можно изменить, чтобы использовать str.format вместо Python 3.5+.

Заключение

С текущим принятым ответом это производительность для более нормальных примеров, приведенных в исходном вопросе:

Примечание: для sh замените ` с \ в следующих командах

 $ python -m timeit -s "из примеров импорта ответов; примеры = примеры [: 7]" `
    -s "из parsedatetime импортировать календарь; из datetime импортировать дату и время" `
    -s "parse = Calendar(). parseDT; now = datetime.now()" `
    "например, в примерах:" "parse(example)[0] - now"
1000 циклов, лучшее из 5: 232 мкс на цикл
$ python -m timeit -s "из answer_re импортировать примеры; примеры = примеры [: 7]" `
    -s "из анализа импорта ответов" `
    "например, в примерах:" " разбор(пример)"
2000 циклов, лучшее из 5: 157 мкс на цикл
$ python -m timeit -s "из answer_re импортировать примеры; примеры = примеры [: 7]" `
    -s "из разбора импорта answer_re" `
    "например, в примерах:" " разбор(пример)"
10000 петель, лучшая из 5:390,5 мкс на цикл
 

Различия в производительности практически незначительны для большого количества вариантов использования.

В настоящее время самым простым в использовании будет пример, приведенный в принятом в настоящее время ответе:

Если не требуется очень индивидуальный синтаксический анализ, используйте parsedatetime .

Исходный ответ

Не решение, потому что dateutil может анализировать моменты времени, но не интервалы

dateutil теперь поддерживает все исходные запрошенные интервалы:
 из анализа импорта dateutil.

admin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *