1

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

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 微控制器启动某些东西(即:是 4 月 30 日和下午 1:01 吗?当时有消息吗?是的?好的,启动)。

我有两个问题:

  1. 第一个模式(“full_pattern”)没有返回任何东西,我不知道为什么。我需要解决完整的问题吗?(包括“日期”位)?

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

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

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

请注意:日期/时间戳为军用时间,其他为 AM/PM

我试过像这样管道它:

 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 的无限循环(可能不是无限的,绝对比我需要的要多)。

任何帮助将不胜感激,谢谢!

4

4 回答 4

3

在线测试正则表达式有助于解决您的正则表达式不起作用的问题。我用过这个

这是我用来解决您的问题的 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

我希望这有帮助。

于 2012-04-26T21:23:00.597 回答
2

我将其发布为答案,因为我没有代表发表评论。

http://www.txt2re.com/

只需粘贴您想要进行正则表达式搜索的文本并开始选择要捕获的内容,您就会获得不同语言的代码示例:)

这个工具简直太棒了。

这对你有用吗? http://www.txt2re.com/index-python.php3?s=DATE%20%20%20%20:%20Fri,%2020%20Apr%202012%2009:15:17%20-0700%20% 28PDT%29%20&28&6&3&2&8&13&29&12

于 2012-04-26T21:04:35.347 回答
1

对您的第一个模式进行了一些修复:

\w{3,4},\s\d{1,2}\s\w{3}\s\d{4}\s\d\d:\d\d:\d\d

(1) 如果您希望在日期名称后使用逗号,请继续明确说明。

(2) 您缺少检测月份日期的模式部分。

我相信您的模式与您的输入相对应,也就是说,日期名称将恰好是 3 或 4 个字符,并且每个元素都由 1 个空格分隔。

我想你想要这个作为你的第二个模式:

\s\d{1,2}:\d\d\s(AM|PM)

我不确定您的输入是否具有领先空间。你可能想要

\d{1,2}:\d\d\s(AM|PM)

反而。

于 2012-04-26T21:23:52.843 回答
1

不确定您的格式,所以这只是一个示例。
如果该行仅按时间格式更改,则可以使用单个正则表达式一次获取所有信息。

\b  ([a-z])+,      # (1) # Fri,
\s+ (\d+)          # (2) # 20
\s+ ([a-z]+)       # (3) # Apr
\s+ (\d+)          # (4) # 2012
\s+ (\d+:\d+:\d+)  # (5) # 11:01:17

(?:                 # Time Zone
    \s+ (-\d+)           # (6) # -0700
    \s+ \( ([a-z]) \)    # (7) # (PDT)

  |                # OR,

                     # Local time 1
   \s+ (\d+:\d+)        # (8) # 11:01
   \s+ ([a-z]+)         # (9) # AM
   (?:               # Local time 2 (optional)
      \s+ (\d+:\d+)     # (10) # 11:03
      \s+ ([a-z]+)      # (11) # AM
   )?
)
于 2012-04-26T21:58:53.200 回答