Python 使用带有日期时间的正则表达式

Python 使用带有日期时间的正则表达式,python,regex,datetime,dictionary,Python,Regex,Datetime,Dictionary,我正在解析一个文本文件中的时间,这个文本文件已经生成了一个名为“entries”的字符串列表。看起来是这样的(但有更多的条目): 我想将每个时间转换为datetime格式,并为每个时间添加4个小时,然后使用适当的键“txup”和“txdown”将新时间存储在字典中 以下是我目前掌握的代码: import re from datetime import datetime import pytz d = {} converted_times = [] local = pytz.timezone("

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

我想将每个时间转换为datetime格式,并为每个时间添加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
第一个问题是,我得到了错误的“时间数据”发送周期。。up:01:22:53'与格式“%H:%M:%S”不匹配。我不确定为什么会出现这个错误,因为我的正则表达式中有适当的捕获组来捕获时间。有人知道为什么会这样吗

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


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

你非常接近!您只需将
组(0)
更改为
组(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

您可能应该将正则表达式中的
s转义为
\.
,因为您只想匹配文字句点,而不是任何字符。您也可以使用以下正则表达式:
*?(?:(?:up:\s*(?[\d:]+)|(?:down:\s*(?[\d:]+)
,并将命名的捕获组收集为数组,而不是运行两个正则表达式。有关中命名的捕获组的信息,请参阅文章python@ctwheels这是很有帮助的,但是有没有一种方法可以作为一个字典,每个键有多个值呢?我需要它的格式:{'txup':['hh:mm:ss','hh:mm:ss'],'txdown':['hh:mm:ss','hh:mm:ss']}@WynneT我对python不太确定;已经有一段时间了。但是,您可以始终基于键重新映射值。
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