1

2 種類の日付/タイムスタンプを含むファイルがあります。まず、次のようにフォーマットされた日付/タイムスタンプがあります。

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

次に、次のようにフォーマットされたタイムスタンプがあります。

12:24 PM

これに対処するために、2 つの正規表現パターンを作成しました。

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 時 1 分ですか? メッセージはありましたか? はい? わかりました、作動させます)。

2 つの質問があります。

  1. 最初のパターン ("full_pattern") は何も返さず、その理由がわかりません。行全体に対処する必要がありますか? (「日付」ビットを含めます)?

  2. これらを一緒に使用するにはどうすればよいですか? したがって、正規表現は最初の日付/タイムスタンプを見つけてからタイムスタンプを出力し、次の日付/タイムスタンプを見つけてからタイムスタンプを出力します。そのようです:

    2012 年 4 月 20 日 (金) 11:01:17 11:01 AM 11:03 AM

    2012 年 4 月 20 日 (金) 09:15:17 21:15 21: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)

しかし、その結果、すべてのパターン 2 の無限ループが発生しました (無限ではない可能性があり、間違いなく必要以上の方法です)。

どんな助けでも大歓迎です、ありがとう!

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

フォーマットがわからないので、これは単なる例です。
行が時間形式によってのみ変更される場合は、単一の正規表現を使用してすべての情報を一度に取得できます。

\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 に答える
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つのスペースで区切られていると信じています。

私はあなたがあなたの2番目のパターンのためにこれが欲しいと思います:

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

あなたの入力にその先頭のスペースがあるかどうかはわかりません。あなたが望むかもしれません

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

代わりは。

于 2012-04-26T21:23:52.843 に答える