Получение даты и времени с помощью регулярного выражения - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь извлечь дату и время из строки, устанавливающей sh дельта между этим и текущей датой и временем. Я попытался преобразовать вывод регулярного выражения из списка в строку, и он отображается как type = string, но в следующем формате - ('18: 06: 39 ',' Jan 30 2020 ').

import re
from datetime import datetime, timedelta, date

string = 'configuration change at 18:06:39 EET Thu Jan 30 2020 by netbrain'
chg_date = re.findall(r"(\d{2}:\d{2}:\d{2}) \w+ \w+ (\w{3} \d{2} \d{4})", string)
chg_date_str = ''.join(map(str, chg_date))
now = datetime.now()
now_format = now.strftime("%H:%M:%S, %b %d %y")
time_difference = now_format - chg_date_str
print(chg_date_str)
print(time_difference)

Я получаю следующую ошибку.

Traceback (most recent call last):
  File "C:/Users/MattSherman/Desktop/Python/y.py", line 15, in <module>
    time_difference = now_format - chg_date_str
TypeError: unsupported operand type(s) for -: 'str' and 'str'

Ответы [ 3 ]

2 голосов
/ 05 февраля 2020

Если вы хотите вычислить дельту времени, вам нужно выполнить арифметику c с datetime экземплярами. Вы можете преобразовать результаты findall() в datetime, используя функцию datetime.strptime(), как показано:

import re
from datetime import datetime, timedelta, date

string = 'configuration change at 18:06:39 EET Thu Jan 30 2020 by netbrain'
matches = re.findall(r"(\d{2}:\d{2}:\d{2}) \w+ \w+ (\w{3} \d{2} \d{4})", string)
chg_date_str = ' '.join(map(str, matches[0]))
chg_date = datetime.strptime(chg_date_str, "%H:%M:%S %b %d %Y")
now = datetime.now()
time_difference = now - chg_date

print(chg_date_str)
print(time_difference)

Выход:

18:06:39 Jan 30 2020
5 days, 16:34:32.661231
2 голосов
/ 05 февраля 2020

В вашем коде много проблем.

  • findall возвращает список кортежей. Вы должны выполнить итерацию в findall результатах или использовать search вместо findall
  • , когда вы объединяете части данных, используя '', но вам нужно ' '
  • %y неправильный шаблон для 4-ди git года, следует использовать %Y
  • при преобразовании даты в строку и попытке найти разницу между двумя строками ...

Я думаю, вы код должен выглядеть примерно так:

import re
from datetime import datetime

string = 'configuration change at 18:06:39 EET Thu Jan 30 2020 by netbrain'
chg_dates = re.findall(r"(\d{2}:\d{2}:\d{2}) \w+ \w+ (\w{3} \d{2} \d{4})", string)
for chg_date in chg_dates:
    chg_date_str = ' '.join(map(str, chg_date))
    chg_date_date = datetime.strptime(chg_date_str, "%H:%M:%S %b %d %Y")
    now = datetime.now()
    time_difference = now - chg_date_date
    print(time_difference)

1 голос
/ 05 февраля 2020

Другие ответили на это, но есть 2 основных вопроса.

Вы пытались отнять 2 строки друг от друга, python не может этого сделать, вместо этого вы должны вычесть 2 объекта datetime. Кроме того, re.findall() возвращает список длины 1, поэтому при объединении chg_date в chg_date_str вам фактически пришлось объединить 0-й элемент в возвращаемом списке, который будет chg_date_str[0]. Это также выглядит чище, если вы объединяете ', ' вместо пустой строки, конечно, соответственно обновляя параметры datetime.

import re
from datetime import datetime, timedelta, date

string = 'configuration change at 18:06:39 EET Thu Jan 30 2020 by netbrain'
chg_date = re.findall(r"(\d{2}:\d{2}:\d{2}) \w+ \w+ (\w{3} \d{2} \d{4})", string)


chg_date_str = ', '.join(map(str, chg_date[0]))
datetime_object = datetime.strptime(chg_date_str, '%H:%M:%S, %b %d %Y')

time_difference = datetime.now() - datetime_object
print(chg_date_str)
print(time_difference)

вывод:

18:06:39, Jan 30 2020
5 days, 19:05:05.272112

, который, как я полагаю, является тем, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...