2012-02-15 21 views
0

同じ文書内に他の単語が存在する場合、特定の単語を含む文書を見つけることが任されています。それは、このように私に言葉で表現された:私はいじりてきた正規表現は他の単語がある場合に単語に一致します

Contains word1 or word2 within the same document as word3 or word4 

/場合は、正規表現のための条件文と、私はかなりそれを把握することはできません。これまで私が持っていたことは次のとおりです。

(?(word3|word4)(word1|word2)|()) 

これは私にとってはうまくいくようです。文書に「word2」のみが含まれていても、それはまだ一致します。

提案がありますか?

+1

Regexのみを使用するように制限されていますか?どのような主要言語を使用していますか? –

+0

(word1とword2)が常に前に来なければ(word3とword4)、正規表現のタックルを持つと、この問題は不必要に複雑に思えます。あなたはプログラミング言語でそのような検索を行うことができますか?そうすれば、単純な(match1 && match2) - >文書が見つかりました! – hexparrot

+0

具体的には「単語」という意味ですか?あなたの "言葉"にはどんな文字が使えますか? –

答えて

1

ここでは正規表現を避けることをお勧めします。それだけでは正規表現を使用していることを書くことは非常に厄介だが、それは先読みのいずれかを使用して行うことができます(Rubular

^(?=.*\b(word1|word2)\b).*\b(word3|word4)\b 

それともここにすべての順列(あまりにも難しいことではありませんを一覧表示することが、より迅速にするために手に負えなくなります複雑な例):(Rubular

\b(?:word1|word2)\b.*\b(?:word3|word4)\b|\b(?:word3|word4)\b.*\b(?:word1|word2)\b 

あなたのテキストは、新しい行が含まドットも改行文字に一致するように正規表現に「すべてをドット」修飾子を追加することができます。これの具体的な構文は言語によって異なりますが、通常、正規表現の区切り文字の後に書かれたフラグ "s"です。しかし、使用している特定の言語のドキュメントを確認してください。


代わりに、文書を単語のコレクション(例:リストまたはセット)に分割してから、通常のコードを使用してコレクションを検索することをおすすめします。

+0

正規表現の非常に素晴らしいデモも同様です。 – hexparrot

+0

私はそれを恐れていました。私は、各ファイルを読み込んで必要なものをスキャンするためのスクリプトを作成しましたが、非常に遅かったです。私はスキャンする必要がある何千ものファイルを扱っています。 –

0

あなたは文字(.|\n)*の任意の組み合わせによってword3|word4から分離word1|word2を検索するグローバルg修飾子セット、で正規表現を使用する必要があります。以下は動作するはずです:

(((word1|word2)(.|\n)*(word3|word4))|((word3|word4)(.|\n)*(word1|word2))) 

Windowsを使用している場合、あなたはおそらく改行文字の異なる取り扱いに、\r\nため\nを変更したいと思います。

+0

Hum、私はこれを試しましたが、grep、egrepまたはgrep -Pでうまく動作しないようです。 –

+0

ええ、今私は括弧を追加することを忘れて、正規表現の中間で交替を分けることを忘れて – Win32

0

おそらく私は質問を誤解しているかもしれませんが、/word1|word2/ && /word3|word4/が両方とも一致すれば、あなたが望むのは本当ですか?

かなり簡単です。コマンドラインからの簡単なデモは次のようになります。

$ perl -0777 -ne 'print "$ARGV\n" if /word1|word2/ && /word3|word4/' file1 file2 file3 ... file9999999 

この条件が成立するすべてのファイル名のリストが出力されます。

Perlはパターンマッチングが言語に組み込まれており、ライブラリとしては使用できないため、Pythonでできることよりもはるかに高速です。たとえば、PerlはAho-Corasickのtrieデータ構造に多くの代替案を最適化します。これはBoyer-Mooreが実際にデータの超高速化を進めるよりも高速です。私はその場であなたのパターンを構築し、トライを利用することをお勧めします。

改行などの処理方法に応じて、/sまたは/mスイッチをパターンに追加できます。それらに対処するためのより移植可能な方法として、\N\Rのようなものを使用することもできます。

関連する問題