2012-04-26 882 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 
    )? 
)