2012-04-26 877 views
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日9时15分17秒 晚上9:15 9:17 PM

请注意:日期/时间戳在军事的时间,其余的是AM/PM

我已经试过管道像这样:

re.findall(pattern1 | pattern2, string) 

但它不喜欢那样。我也试过在同时运行它们的循环,就像这样:

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) 

但是,这导致所有模式2的无限循环(可能不是无限的,绝对的方式比我更需要)。

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

回答

3

在线测试正则表达式有助于排除不起作用的正则表达式。我用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 

我希望这有助于。

+0

刚刚测试过并取得了不错的成绩。谢谢! – spikem 2012-04-26 22:51:56

2

即时发布此作为答案,因为我没有代表发表评论。

http://www.txt2re.com/

只需粘贴文本,你想要做一个正则表达式搜索,并开始选择的东西来捕捉和你的代码示例在不同LANGS :)

这个工具简直是惊人的。

可能为您工作? 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

+0

哦真棒,我听说这些类型的工具,但总是试图通过自己的问题,以头撞我的路......也许是时候来测试他们。 – spikem 2012-04-26 21:27:03

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个字符,并且每个元素间隔一个空格。

我想你想这对于你的第二个模式:

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

我不知道你的输入是否有领先的空间。您可能需要

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

改为。

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 
    )? 
)