2017-06-26 7 views
0

古いJavaコードを見て、いくつかの文字列から日付とそのフォーマットを抽出しました。条件や正規表現のパターンやマッチャーがひどく混乱した。 だから私は最近、これをPythonでどのように解決するのかと考えました。私は、日付形式にマップされた数多くの正規表現パターンを持っています。そこから、時にはタイムスタンプが作成されます。私はちょうどJavaソリューションからそれらをコピーしたので、私はこれらの日付のパターンを変更する必要があることだと思う*二重引用符を使用してRegExを追加の "命令"にマッピング

pattern_dic = { 
    "[\\d]{2}:[\\d]{2}, .{3} [\\d]{1,2}, [\\d]{4} \\(UTC\\)": "HH:mm, MMM dd, yyyy (zzz)", 
    "[\d]{2}:[\d]{2}, [\d]{1,2} .{3} [\d]{4} \(UTC\)"  : "HH:mm, dd MMM yyyy (zzz)", 
    ... 
} 

:私は「Javaでswitch文がある場合は、Pythonでdictonaryがあるはずです」を聞きました。

正規表現/置換のペアがある別の問題では、このような辞書を使用してかなり良い解決策を見つけました。 (Stack Overflowの素晴らしい人に礼儀正しくて)これは、一致する正規表現が単純な文字列である場合にのみ機能するので、辞書で検索することができます(私は思う)。

pattern_acc = re.compile(r'\b(' + '|'.join(pattern_dic.keys()) + r')\b') 
comment = pattern_acc.sub(lambda x: pattern_dic[x.group()], comment) 

ここまでは私がこれまでに思いついたことです。

def multi_match(input_string, pattern_dic): 
    date_pattern = re.compile(r'\b(' + '|'.join(pattern_dic.keys()) + r')\b') 
    matches = date_pattern.findall(input_string) 

    date_formats = [] 
    for match in matches: 
     matching_string = match.group() 
     date_format = pattern_dic["matching_date_pattern"] 
     date_formats.append((matching_string, date_format)) 

が編集: 私はと述べている必要があります私の問題は、私は私の辞書(「matching_date_pattern」)でルックアップするために正規表現のマッチングの部分を得ることができる方法がわからないということですこれを予備的な問題として解決したい。マッチングと検索を分けていきたいと思います。一致するパターンにアクセスすることができます。 たとえば、正規表現が多数のグループで構成され、一致する「命令」がより複雑になると考えてください。たとえば、リンク、マークダウン要素など、さまざまなテキストオブジェクトがたくさんあるとします。私の現時点での問題は、マッチングと検索の間にどのパターンがマッチしているかを知ることです。

多分、パターンをコンパイルするのはどれほど費用がかかりますか?それはもちろん、それらを別々にコンパイルすれば、それらにアクセスしやすくなります。

+0

パターンを繰り返して、一致するものが見つかると必要な値を取得する方が簡単です。 –

答えて

0

あなたはスタックオーバーフローから強奪このコードは良いですが、あなたが任意の複数の正規表現の一致するようにしたいですが、あなたの正規表現のは、すべての特定のケースで一致を見つけることのあなたの問題を解決していません。

def multi_match(input_string, pattern_dic): for regexp in pattern_dic: re.search(regexp, input_string) matching_string = match.group() date_format = pattern_dic[regexp] date_formats.append((matching_string, date_format)) return date_formats 
サイド発言

:あなたはむしろちょうどpattern_dicを反復し、順番にすべてのキーを確認する必要があり.appendを一つの引数を取りますので、タプルを形成する必要がある - 括弧のため、追加のペアを。

+0

ありがとうございます。私は質問を編集し、マッチングと検索を分離したい理由をいくつか編集しました。 –

+0

しかし、まだパターンを個別にコンパイルしなければならないという意味ではおそらく正しいでしょう。 –

+0

正規表現の数があまり多くない場合、Pythonがあなたのためにそれを実行し、結果をキャッシュするので、正規表現の数があまり多くない場合、明示的にそれらをコンパイルする必要はありません。しかし、たくさんのものがある場合(私が正しく覚えていれば512以上のものがたくさんあります)、Pythonのキャッシュを超えてコンパイルするのは良い考えです。 –

関連する問題