2016-10-02 21 views
0

編集:申し訳ありませんが、私はちょうど2つのリンクを挿入することが許されています、他のものはプレーンテキストのようにここにあります。Python 3正規表現グループ化を正しく使うには?

こんにちは 私はPythonと正規表現の新機能です。私はregex101と他の多くのサイトでそれを正しく使う方法を探しましたが、それはうまくいかず、何をすべきか分かりません。

私は自宅でいくつかのIPカメラを持っており、彼らはftpの写真を送信します。 (私はMACと文字列からシリアル削除)のような 彼らは名前を持っている:

  • image_20130225_175225_9.jpg
  • AABBCCDDEEFF(UserNameOfCam)_0_20150905215835_0.jpg
  • 112233445566(0000serial)_0_20130625223148_1337167.jpg
  • -6789ABCDEF01-234567_20160724_180030.jpg
  • AA_BB_CC_DD_EE_FF_OPI--QWERT_0_20130724133101_8.jpg

1日に1回空き容量を確保するには、すべてのJPEG画像をmp4 over mencoderにバッチファイル(ウィンドウ)で変換します。それはすでに動作していますが、画像では時間情報で焼かれていません。これはOSDなしの単なる絵です。

私はビデオプレーヤーで字幕として時刻と日付を表示する.srtファイルを作成しようとしました。私はちょうど学校でCを学んだので、各ファイル名を見てそれを作る醜い方法をハードコードし、文字列のどの部分が各カムを手動で検索したかなど。最初のカムは常に "image_"で始まり、カムの名前で2番目のカムであり、3番目のカムはファイル名のシリアルであり、以下同様である。

それは以下のようになります。

if(strstr(temp_line, "image")) //for the first cam 
     { do extracting info } 
else if(strstr(temp_line, "(UserNameOfCam)_")) //for the second 
     { do extracting info } 
else if(... 

それは非常にunflexibleだったと私は第二カムの名前を変更したい場合は、私はCで手動SRTジェネレータのソースコードを変更し、それを毎回再コンパイルする必要がありました。

私は「地獄、Pythonを試してみましょう。それはそのようなスクリプトのために作られました」と思っていました。数時間から数時間のプログラミングとグーグルでスクリプトを作ったのです。それで完璧にフィットするので正規表現でやりたかったのです。

ので、私は初心者の私は、正規表現の作りとマッチングのためのpythexを視覚化するdebuggexを使用しています。これまでのところ、最初のカメラを認識することができ、私は満足していました:)しかし、今では数時間後に1パターン以上認識していますが、私は何が間違っているのか分かりません。私が試した\グラム(?P =とどれもが、これらの他の多くのmethodesが。私はcompletly何か間違ったことをやっていると知っていないもの。ここで

は、第一カムのパターンで作業している

www.debuggex。COM/R/kvd5IZc760Z-cZmz

Here is the matching of the first cam

ここで最初の2つのカム

のために動作していない試みはwww.debuggex.com/r/C0TwsxHS9QZoXIFc

ですそして、必要に応じてsrtを作成するPythonのスクリプトです。

pastebin.com/kZPQnu9T

それを動作させるために何をすべきか任意のヒントや勧告を、またはどこが間違っているの手順を作ったのですか?

EDIT2:時間と日付がファイル名のストアであるため、正規表現から抽出した情報が必要です。

EDIT3: replyaに感謝します。 1つの正規表現にすべてを配置することは、100k行まで解析する必要があるため、高速化すると考えました。また、 "年"のようなグループとしてパターンの名前を付けることができるので、正規表現から情報を抽出しようとしました。年の情報は常に同じなので、年のパターンを一度作成し、必要なときに再利用すると、抽出も処理されますが、そのようには機能しません。最初のカムからすべての有用な情報を抽出することができますが、最初のカムからパターンを再利用しようとすると2番目のものと一致しません。 "(?P =年)"の行は一致しません。最初のカムと同じ行で再作成すると、今年のグループが2倍になったためエラーになります。それは私が最初のカムの全体のパターンを削除IFで動作しますが。

+0

ようこそ。この質問に本当に必要なのはmcveです。 http://stackoverflow.com/help/mcveを参照してください。これは、空のファイルから始まり、regexの問題を示す完全なpythonプログラムを作成し、mp4への変換のような他のすべてのものを切り捨てることを意味します。その短いPythonファイルを質問に貼り付けます(リンクしないでください)。それを見て、ダウンロードしてテストすることもできます。あなたはそのようにより良い答えを得るでしょう。 –

+0

*「100k行まで解析する必要があるため、すべてのものを1つの正規表現に配置する方が速くなると思っています。」 - 早期の最適化はしないでください(すべての悪の根源なので)。動作する最も単純なソリューションを実装し、遅すぎる場合は、より高速なソリューションを見つけようとします。 – zvone

答えて

0

すべてに一致する1つの巨大な正規表現を作る必要はありません。特定のカメラと一致するいくつかの小さな正規表現を作る方が良いです。

カメラ1とカメラ2を処理したい場合、同じコードがこのように見える可能性があります。

import re 

cam1 = re.compile(r'some regex') 
cam2 = re.compile(r'something else') 

if cam1.match(filename) and cam2.match(filename): 
    process_data() 

また、正規表現から情報を抽出する場合にのみグループ化する必要があります。そうでなければ、グループ化は本当に必要ではありません(正規表現をより読みやすくしたい場合を除いて)。

+0

たぶんこれは、すべてのカムに独自の正規表現を与えるためにできるだけ早く動作させるための最良のケースです。私の理解のためだけに:他のグループのグループを再利用することは可能ですか?そして、すべてのカム解析を1つの正規表現に入れることも可能ですか? – Hairy

+0

1つの巨大な正規表現を構築することは可能です。しかし、私はお勧めしたいものではありません。自分自身や他人のために理解するのがずっと難しくなります。すでに発見したように、デバッグが難しくなります。他の正規表現で正規表現の一部を再利用することができます。それは単に文字列です。 – Jonathan

関連する問題