У меня есть файл журнала, который содержит строки, такие как
### 192.168.70.10 on 2018-06-19 23:57:37.846200 ###
### 192.168.70.11 on 2018-06-19 23:50:33.073267 ###
Он также может содержать другие данные по разным строкам.
Я хочу напечатать все строки, начинающиеся С###, и извлечь их дату/время, чтобы я мог сравнить их с другой датой/временем.
Как я могу это сделать? Должен ли я использовать Regex?
Вот пример того, что я делаю...
try:
with open('myfile.log', 'r') as myfile:
for line in myfile:
if "###" in line:
x = line
print(x)
# get date and time from x
myfile.close
except OSError as e:
print (e)
Вы можете использовать регулярное выражение и проанализировать захваченную группу с помощью datetime.striptime
Это позволит вам редактировать регулярное выражение для соответствия 1 или нескольким пробелам и т.д.
from datetime import datetime
import re
with open('myfile.log') as myfile:
for line in myfile:
# Adding the ### into the regex allows you to remove the conditional if ### in line
regex = r'###\s+\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}.+(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.\d{0,})\s###'
r = re.match(regex, line)
if r: # If there is a matching group, return matching group 1
dt = datetime.striptime(r.group(1), "%Y-%m-%d %H:%M:%S.%f")
print(dt)
Вы можете использовать регулярное выражение в этом типе проблем
try:
with open('myfile.log', 'r') as myfile:
reg = re.compile('^###.*on\s([\w\s.:-]*)')
for line in myfile:
m = reg.match(line)
if m:
datetime.striptime(m.group(1), "%Y-%m-%d %H:%M:%S.%f")
None
, так что это тоже нужно проверить.
Предполагая, что строка всегда имеет фиксированный формат, тогда это должно работать:
# Extract the date and time substring.
s = x[-30:-4]
# Parse the string into a datetime object.
dt = datetime.datetime.strptime(s, "%Y-%m-%d %H:%M:%S.%f")
Подробную информацию о строке шаблона см. В документации по strptime()
.
Если формат строки в вашем лог файле меняется, тогда может работать регулярное выражение (см. Ответ Дэниелса) или рассмотреть корректный синтаксический анализ строки.
2
в начале, и ваша строка шаблона содержит :%f
вместо .%f
r"…(?P<dt>...)…"
а затем ссылаться на нее по имени, а не по смещению:r.group("dt")
. Я думаю, что это немного легче читать и поддерживать.