0

正規表現を使用して、次の形式のデータを識別しようとしています: XX 日、XX 時間、XX 分 (空白、コンマ、および複数形による最小限の構造変化が予想されます)日時間と分に関連付けられた数値を取得します。

私は次のことを試しました:

matchingTime = "27 days, 21 hours, 23 minutes ago"
re.search('([0-9]{0,2}).*day.* ([0-9]+) .*hour.* ([0-9]+) .*minute.*',matchingTime)

上記の場合、正常に動作し、グループ 1 2 3 の値をそれぞれ取得します。

問題は、フィールドのいずれかが必ずしも存在するとは限らないことです。

matchingTime = "21 hours, 23 minutes ago"

上記の場合、失敗します。

私は try と exceptions を使用してそれを実行できることを知っていますが、それを行うための簡潔で効率的な方法を見つけたいと思っていました。

どんな入力も本当に役に立ちます。私の質問にさらに説明を加えていただければ幸いです。

編集:[0-9]{0,2}日々の部分では、これを解決するいくつかの方法を試してみてください。

4

1 に答える 1

2

おそらく、次のような正規表現を使用できます。

(?:(?P<days>[0-9]{0,2})\s*day[^, ]*,? *)?(?:(?P<hrs>[0-9]+)\s*hour[^, ]*,? *)?(?:(?P<min>[0-9]+)\s*minute[^, ]*,? *)?

正規表現101のデモ

[^, ]*,? *オプションのコンマとスペースに使用しています.*が、バックトラックが多すぎないように使用していません。

また、名前付きキャプチャ グループを使用し、日/時間/分ごとにグループ全体を非キャプチャ グループにラップしました?。各グループはかなり似ています:

(?:                       # Start of non-capture group
    (?P<days>[0-9]{0,2})  # Numbers to capture
    \s*                   # Spaces if any
    day                   # Literal match
    [^, ]*,? *            # Anything until first comma and optional spaces
)?                        # Close of non-capture group and marking it as optional
于 2013-10-08T16:34:11.610 に答える