Удаление даты в конце строки (разные форматы дат)

#python #string #date #format

#питон #строка #Дата #формат

Вопрос:

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

 text1 = "Hi im some text 1.31. dec. 2020" text2 = "Hi im some text 2.May, 25, 2019"  def remove_date_from_end(initial_text):  matches = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct",  "Nov", "Dec", "dec"]  for match in matches:  if match in initial_text[-14:]:  print("Found Date in Answer")  initial_text = initial_text.split(match)[0]  return initial_text  return initial_text  print(remove_date_from_end(text1)) print(remove_date_from_end(text2))  

Выход:

 Found Date in Answer Hi im some text 1.31. Found Date in Answer Hi im some text 2.  

Вывод для text2 правильный, но я, кажется, не могу понять, как заставить text1 правильно отображаться как «Привет, я немного текста 1».

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

Комментарии:

1. Я думаю, что, вероятно, я мог бы обойти это с помощью тонны заявлений «если», но я надеялся, что есть лучший способ.

2. Знаете ли вы, какие все форматы дат вам нужно обрабатывать?

3. всегда ли дата указана в последних 14 символах строки?

4. Да, все примеры, с которыми я сталкивался до сих пор, находятся в последних 14 символах строки

Ответ №1:

вы можете использовать регулярное выражение

 import json from re import search, IGNORECASE from calendar import month_abbr from datetime import datetime  text1 = "Hi im some text 1.31. dec. 2020" text2 = "Hi im some text 2.May, 25, 2019"  formats = [  (  '{month}, d{{1,2}}, d{{4}}',  '%b, %d, %Y'  ),  (  'd{{1,2}}. {month}. d{{4}}',  '%d. %b. %Y'  ), ]   def find_date(text):  for fmt in formats:  for x in [fmt[0].format(month=x) for x in month_abbr if x]:  if (x := search(x, text, IGNORECASE)):  return {  'text': text[:x.start()],  'date': datetime.strptime(x.group(0), fmt[1]).date(),  }  print(find_date(text1)) print(find_date(text2))  

Комментарии:

1. Хорошее предложение. Хотя, похоже, он выводится не совсем правильно. Я вижу результат как: 1.31. декабрь 2020 года и 2.25 мая 2019 года. Ожидаемый результат будет: Привет, немного текста 1. и Привет, немного текста 2. Похоже, что регулярное выражение может быть ответом. Хотя это мне очень чуждо.

2. @user3571198 — Я допустил ошибку в регулярном выражении и включил первое число 😀