2016-04-28 13 views
0

私はフォルダ内にたくさんのファイルを持っています。すべてをプレーンテキストファイルに変換すると仮定しましょう。python - ファイル内の単語の複合ブール検索

私はこのような検索を実行するのpythonを使用したい:

query = '(word1 and word2) or (word3 and not word4)' 

実際logcが変化し、複数の単語を一緒に使用することができます。別の例:

query = '(shiny and glass and "blue car")' 

また、これらの単語は変数であるため、ユーザーによって提供されます。

私は一致した文章とファイル名を表示したいと思います。 これはwhooshやhaystackのような複雑な検索エンジンを必要とせず、フィールドでファイルを索引付けする必要があります。 また、これらのツールでは、上記で説明したようにブール値のクエリがないようです。 pdfquery私はpdfsのために欲しいものを正確に提供していますが、今はテキストファイルとxmlファイルに必要です。

提案がありますか?

+0

は安全であることがわかっているクエリですか? 'eval'はここで簡単に提供されますが、これがユーザの入力であればそれは非常に危険です –

+0

' word'が暗黙のうちに 'word'を意味するold-school検索エンジンのようなセマンティクスで解釈されるはずですか?資料"? – user2357112

+0

ユーザーは単語とセマンティクス(AND、OR、NOT、かっこ)を入力します。 – max

答えて

0

私は、私はそれは同様に他の人に役立つことを願っています​​

と呼ばれるPythonパッケージを作ったので、私は本当にこのようなソリューションを持っている必要がありました。

1

簡単な方法はありませんが、これは簡単ではありません。安全でない文字列を実行可能なコードに変換しようとしていますので、簡単な方法をとることができず、evalを使用してください。これらはリテラルではないので、ast.literal_evalも使用できません。 AND,NOTOR(、および)のようなものを認識し、文字列以外のものとみなすレクサーを作成する必要があります。一番上では、化合物のブール値を扱う必要があるように思われるので、これはあなたが思っているよりもはるかに難しくなります。

で検索することを尋ねられます。これはPythonの動作方法ではありません。 by-lineの代わりにデータby-sentenceを得るには、別のレクサーを書かなければならないでしょう。これを効果的に行うには、ioモジュールをよく読んでください。私はそれをオフハンドで行う方法はわかりませんが、基本的にループするデータがある間にループし、各反復をバッファーに読み込み、到達したときに降伏します。"\.(?=\s+)"

最初のクエリレクサーの結果を、ファイルレクサーの結果を横断して実行される一連のリスト内包によって実行します。

+0

それだけで、awkを使った方がいいでしょう。 –

+0

Awkには文のセマンティクスもありません。 –

+0

@AdamSmith文章ではなく行単位で検索するように仕様を変更するとどうなりますか?その場合の解決法はありますか? – max

関連する問題