今日はPythonでMicrosoft Wordをgrep検索するプログラムを作ったので、それを紹介しようと思います。

Wordでいろいろな文章を作成する事がありますが、ファイルが多くなってくると「あの文章、どこに書いたんだっけ?」ということが起きてしまうと思います(少なくとも私はよくあります)。

私は普段、テキストエディタに秀丸というソフトウェアを使っていますが、秀丸には指定したフォルダに含まれている複数のテキストファイルからキーワード検索する機能が含まれています。この機能はgrep検索として知られているものです。

このgrep検索がWordファイルでできればとても便利になると思い、今回のプログラムを作った次第です。すでにWordをgrep検索できるソフトウェアはありますが、Pythonの勉強もかねて自分で作ってみました。

※Windowsで動かすことを前提にしたプログラムですので、ご注意ください。

使い方

プログラムを実行すると以下のような画面が開きます。

一番上に検索キーワードを入れるテキストボックスと、検索を実行する「find」ボタンがあります。検索には正規表現も使えます。また、その下にある「recursive」にチェックを入れると、サブフォルダに含まれるファイルも検索します。

「folder…」ボタンを押すと、検索するフォルダを指定するためのダイアログが開きます。検索するフォルダが指定する前に「find」ボタンを押しても、同様にフォルダを指定するダイアログが開きます。

今回は以下のように5つのdocxファイルがあるフォルダを指定して、「results」という文字が含まれるファイルを検索してみました。

検索結果が、下の部分に表示されます。

結果をダブルクリックすると、そのファイルがWordで開くようになっています。

必要モジュール

docx2txtモジュールをインストールする必要があります。

ソースコード

プログラム全体のソースコードは以下の通りです。

プログラムの簡単な説明

細かい説明は省き、メインとなる処理の部分だけ説明していきます。

検索結果をダブルクリックしたときにファイルを開く処理です。特に99行目にあるWordプログラムのパスは環境によって違うと思いますので、書き換えが必要です。また101行目の処理ですが、Windowsのパスは「\(円マーク・バックスラッシュ)」が使われるので、「/(スラッシュ)」を置換しています。

メインの検索処理の部分です。docx2txtモジュールを使って、Wordファイルからテキスト情報を抜き出しています。175~176行目では、re.subメソッドで改行が2つ以上続く部分を1つの改行にし、splitメソッドで1文ごとに分割しています。分割された1文ごとに正規表現で検索し、一致する部分があれば、その分をResultクラスの保存しておきます。

最後にResultsのリストをテキストエリアに表示しています。