Skip to main content
 首页 » 编程设计

python之使用正则表达式匹配多种日期/时间戳

2025年05月04日22lovecherry

我有一个包含两种不同类型的日期/时间戳的文件。首先,我的日期/时间戳格式如下:

DATE    : Fri, 20 Apr 2012 09:15:17 -0700 (PDT) 

其次,我的时间戳格式如下:

12:24 PM 

我写了两个正则表达式模式来处理这个问题:

full_pattern = re.compile('\w{3,4}\W\s\w{3}\s\d{4}\s\d\d:\d\d:\d\d') 
time_pattern = re.compile(' \d:\d\d\s[\w]{2}') 

这些是对话,所以我正在寻找一个输出,其中包含对话开始的日期和时间,然后是对话中每个项目的时间戳。其最终应用是在每次日期和时间匹配时使用 Arduino 微 Controller 启动一些东西(即:是 4 月 30 日和下午 1:01 吗?当时有消息吗?是的?好的,启动)。

我有两个问题:

  1. 第一个 pattern("full_pattern") 没有返回任何东西,我不明白为什么。我需要解决整行吗? (包括“DATE”位)?

  2. 如何一起使用它们?所以正则表达式找到第一个日期/时间戳然后打印出时间戳,找到下一个日期/时间戳然后打印出时间戳。像这样:

    2012 年 4 月 20 日星期五 11:01:17 上午 11:01 上午 11:03

    2012 年 4 月 20 日星期五 09:15:17 晚上 9:15 晚上 9:17

请注意:日期/时间戳是军用时间,其他时间是上午/下午

我试过像这样用管道输送它:

 re.findall(pattern1 | pattern2, string) 

但它不喜欢那样。我还尝试在 for 循环中同时运行它们,如下所示:

 for line in string: 
         pattern1 = re.compile('\w{3,4}\W\s\w{3}\s\d{4}\s\d\d:\d\d:\d\d') 
         pattern2 = re.compile(' \d:\d\d\s[\w]{2}') 
         re.findall(pattern1, string) 
         re.findall(pattern2, string) 

但这导致了所有 pattern2 的无限循环(可能不是无限的,绝对比我需要的多得多)。

非常感谢任何帮助,谢谢!

请您参考如下方法:

在线测试正则表达式有助于解决无法正常工作的正则表达式问题。我用了this one .

这是我用来解决您的问题的 Python:

import re 
 
full_pattern = r'\w{3,4}\W\s\d{1,2}\s\w{3}\s\d{4}\s\d{2}:\d{2}:\d{2}' 
time_pattern = r'\d{1,2}:\d{2}(\s(A|P)M)?' 
combo_regex = '(%s)' % ('|'.join([full_pattern, time_pattern]),) 
 
with open(r'C:\Users\spikem\file_with_two_different_types_of_dates.txt','r') as f: 
    for line in f: 
        p = re.search(combo_regex, line, re.IGNORECASE) 
        if p: 
            print p.group() # Assumes a max of one match per line 

这里是一些示例输出:

Fri, 20 Apr 2012 09:15:17 
12:24 PM 
Tue, 10 Jan 2012 00:00:00 
Fri, 20 Jan 2012 00:00:00 
Mon, 30 Jan 2012 00:00:00 
Thu, 09 Feb 2012 00:00:00 
Sun, 19 Feb 2012 00:00:00 
Wed, 29 Feb 2012 00:00:00 
Sat, 10 Mar 2012 00:00:00 
Tue, 20 Mar 2012 00:00:00 
Fri, 30 Mar 2012 00:00:00 
Mon, 09 Apr 2012 00:00:00 
Thu, 19 Apr 2012 00:00:00 
Sun, 29 Apr 2012 00:00:00 
Wed, 09 May 2012 00:00:00 
Sat, 19 May 2012 00:00:00 
Tue, 29 May 2012 00:00:00 
Fri, 08 Jun 2012 00:00:00 
Mon, 18 Jun 2012 00:00:00 
Thu, 28 Jun 2012 00:00:00 
Sun, 08 Jul 2012 00:00:00 
Wed, 18 Jul 2012 00:00:00 
Sat, 28 Jul 2012 00:00:00 
Tue, 07 Aug 2012 00:00:00 
Fri, 17 Aug 2012 00:00:00 
Mon, 27 Aug 2012 00:00:00 
Thu, 06 Sep 2012 00:00:00 
Sun, 16 Sep 2012 00:00:00 
Wed, 26 Sep 2012 00:00:00 
Sat, 06 Oct 2012 00:00:00 
Tue, 16 Oct 2012 00:00:00 
Fri, 26 Oct 2012 00:00:00 

希望对您有所帮助。