【问题标题】:Using regex with datetime使用带有日期时间的正则表达式
【发布时间】:2017-09-01 19:41:09
【问题描述】:

我正在从一个文本文件中解析时间,该文件已生成一个名为“条目”的字符串列表。它看起来像这样(但有更多条目):

['tx cycle.. up:01:22:53 tx cycle.. down:21:03:11', 
 'tx cycle.. up:12:43:31 tx cycle.. down:19:13:00', ...]

我想将每个时间转换为日期时间格式并为每个时间添加 4 小时,然后使用适当的键“txup”和“txdown”将新时间存储在字典中。

这是我目前的代码:

import re
from datetime import datetime
import pytz

d = {}
converted_times = []
local = pytz.timezone("Etc/GMT+4")
dtlist = (["txup", "\s?tx\scycle.{0,4}\s?up:\s?(\d{1,2}:\d{2}:\d{2})"],
          ["txdown", "\s?tx\scycle.{0,4}\s?down:\s?(\d{1,2}:\d{2}:\d{2})"])

for entry in entries:
    for i in range(len(dtlist)):
        local_time = datetime.strptime(re.search(dtlist[i][1], entry).group(0), 
'%H:%M:%S') #first problem arises here
        localized_time = local.localize(local_time)
        utc_time = localized_time.astimezone(pytz.utc)
        converted_times.append(utc_time)

uttime = map(str, converted_time)
d['uttime'] = uttime

第一个问题是我收到错误“时间数据'tx cycle.. up:01:22:53' does not match format '%H:%M:%S''。我不确定为什么会收到此错误,因为我的正则表达式中有适当的捕获组来捕获时间。有人知道为什么会这样吗?

除此之外,我不确定如何确保每次将数据插入到字典中的正确键下。因为正如我现在的代码一样,我很确定它会全部放在一个名为“uttime”的键下,但我实际上希望将其分为键“txup”和“txdown”。有没有一种简单的方法可以在我的循环中做到这一点?

编辑:将 group(0) 更改为 group(1) 后,现在解决了正则表达式问题,但是现在当我尝试根据时区调整更改时间时,我收到了“datetime. time' 对象没有属性 'astimezone'。我似乎无法在网上找到我应该改用什么属性 - 有人知道吗?

【问题讨论】:

  • 您可能应该将正则表达式中的.s 转义为\.,因为您只想匹配文字句点而不是任何字符。
  • 您也可以使用这个正则表达式:.*?(?:(?:up:\s*(?<time_up>[\d:]+))|(?:down:\s*(?<time_down>[\d:]+))) 并将命名的捕获组收集为您的数组,而不是运行两个正则表达式。有关 python 中命名捕获组的信息,请参阅 this 帖子
  • @ctwheels 这很有帮助,但是有没有办法将其作为字典来代替,每个键有多个值?我需要这种格式:{'txup': ['hh:mm:ss', 'hh:mm:ss'], 'txdown': ['hh:mm:ss', 'hh:mm:ss' ]}
  • @WynneT 我不太确定python;有一阵子了。但是,您始终可以根据键重新映射值。

标签: python regex datetime dictionary


【解决方案1】:

你非常接近!您只需将group(0) 更改为group(1) 即可获得正确的捕获组。修复:

import re
from datetime import datetime
import pytz

d = {}
converted_times = []
local = pytz.timezone("Etc/GMT+4")
dtlist = (["txup", "\s?tx\scycle.{0,4}\s?up:\s?(\d{1,2}:\d{2}:\d{2})"],
          ["txdown", "\s?tx\scycle.{0,4}\s?down:\s?(\d{1,2}:\d{2}:\d{2})"])

entries = ['tx cycle.. up:01:22:53 tx cycle.. down:21:03:11', 
         'tx cycle.. up:12:43:31 tx cycle.. down:19:13:00']

for entry in entries:
    for i in range(len(dtlist)):
        local_time = datetime.strptime(re.search(dtlist[i][1], entry).group(1), 
'%H:%M:%S') #first problem arises here
        localized_time = local.localize(local_time)
        utc_time = localized_time.astimezone(pytz.utc)
        converted_times.append(utc_time)

uttime = map(str, converted_times)
d['uttime'] = uttime

【讨论】:

    猜你喜欢
    • 2019-02-26
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2011-03-09
    相关资源
    最近更新 更多