PythonでWord文書内のテキストを検索・置換する方法

文書処理の効率化は、現代のオフィス業務における重要な競争力となっています。膨大な数のWord文書において、繰り返し発生する煩雑なテキスト修正作業に対し、手動操作では時間と労力を要するだけでなく、人的ミスによるデータの不整合を招く可能性もあります。Pythonは、その強力な自動化処理能力を活用することで、文書をバッチ処理で効率的に変換する新たな解決策を提供します。簡潔なPythonプログラムを作成することで、文書の内容を正確に特定し、複数条件に基づいたテキストのインテリジェントな置換を実現し、文書処理の一貫性と正確性を保証できます。本記事では、**Pythonを使用してWord文書内のテキストを検索および置換する方法**を紹介します。

- **[PythonでWord文書のテキストを検索・置換する](#pythonでword文書のテキストを検索置換する)**
- **[正規表現を使用してWord文書のテキストを置換する](#正規表現を使用してword文書のテキストを置換する)**
- **[Word文書のテキストを検索して画像に置換する](#word文書のテキストを検索して画像に置換する)**

ここで紹介する方法では、無料で利用できる[Free Spire.Doc for Python](https://jp.e-iceblue.com/introduce/introduce-free-doc-for-python.html)を使用します。PyPIから以下のコマンドでインストールできます：`pip install spire.doc.free`。

---

## PythonでWord文書のテキストを検索・置換する
Word文書を`Document`インスタンスに読み込み、`Document.Replace()`メソッドを使用することで、指定されたテキストを新しいテキストに置換できます。文書内のすべての一致箇所を置換する方法のほか、最初の一致箇所のみを置換することも可能です。その場合は、置換を実行する前に`Document.ReplaceFirst`プロパティを`True`に設定します。以下に操作手順を示します。

### 操作手順
1. 必要なモジュールをインポートします（`Document`）。
2. `Document`インスタンスを作成し、`Document.LoadFromFile()`メソッドを使用してWord文書をファイルから読み込みます。
3. 最初の一致箇所のみを置換する場合は、`Document.ReplaceFirst`プロパティを`True`に設定します。
4. `Document.Replace()`メソッドを使用して、指定されたテキストを新しいテキストに置換します。
5. `Document.SaveToFile()`メソッドを使用して文書を保存します。

### **コード例**

```python
from spire.doc import Document
import re

# Documentインスタンスを作成しファイルを読み込む
doc = Document()
doc.load_from_file("example.docx")

# 正規表現を使用してテキストを置換
pattern = re.compile(r"(\d{4})年")
doc.replace(pattern, r"\1年（西暦）")

# ファイルを保存
doc.save_to_file("updated_example.docx")
```

結果
![PythonでWord文書のテキストを検索・置換](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/b677430d-e2f7-4718-80df-a3e4f56241ba.png)

---

## 正規表現を使用してWord文書のテキストを置換する
明確なテキストを直接指定して置換するだけでなく、`Document.Replace()`メソッドは正規表現を使用した検索および置換にも対応しています。これにより、より柔軟なテキスト操作が可能になります。

### 操作手順
1. 必要なモジュールをインポートします（`Document`、`Regex`）。
2. `Document`インスタンスを作成し、`Document.LoadFromFile()`メソッドを使用してWord文書をファイルから読み込みます。
3. 正規表現を使用して`Regex`オブジェクトを作成します。
4. `Document.Replace()`メソッドを使用して、正規表現に一致するテキストを新しいテキストに置換します。
5. `Document.SaveToFile()`メソッドを使用して文書を保存します。

### **コード例**
```python
from spire.doc import Document, Regex

# Document オブジェクトを作成
document = Document()
# Word 文書を読み込む
document.LoadFromFile("Sample1.docx")

# #で始まるテキストを一致させる正規表現を作成
regex = Regex(r"ORD-\d{8}")

# 正規表現に一致するテキストを検索し、別のテキストに置き換える
document.Replace(regex, "ORD-[注文ID]")

# 文書を保存
document.SaveToFile("output/正規表現検索置換.docx")
document.Close()
```

結果
![正規表現を使用してWord文書のテキストを置換](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/87748d2e-fe49-42ed-a48d-a39fc2e0382b.png)

---

## Word文書のテキストを検索して画像に置換する
`Document.FindAllString()`メソッドを使用してWord文書内の指定されたテキストを検索し、そのテキストを削除して対応する位置に画像を挿入することが可能です。以下に操作手順を示します。

### 操作手順
1. 必要なモジュールをインポートします（`Document`、`DocPicture`）。
2. `Document`インスタンスを作成し、`Document.LoadFromFile()`メソッドを使用してWord文書をファイルから読み込みます。
3. `Document.FindAllString()`を使用して指定されたテキストを検索し、一致箇所のコレクションを取得します。
4. コレクション内の各テキストを以下の手順で処理します：
    - `DocPicture`オブジェクトを作成し、`DocPicture.LoadImage()`メソッドを使用して画像ファイルを読み込みます。
    - `TextSelection.GetAsOneRange()`メソッドで一致したテキストを範囲として取得します。
    - `TextRange.OwnerParagraph.ChildObjects.IndexOf()`メソッドで、該当段落内のテキストのインデックスを取得します。
    - `TextRange.OwnerParagraph.ChildObjects.Insert()`メソッドで画像を挿入します。
    - `TextRange.OwnerParagraph.ChildObjects.Remove()`メソッドでテキストを削除します。
5. `Document.SaveToFile()`メソッドを使用して文書を保存します。

### **コード例**

```python
from spire.doc import Document, DocPicture

# Document オブジェクトを作成
document = Document()
# Word 文書を読み込む
document.LoadFromFile("Sample2.docx")

# 文書内で特定のテキストを検索
selections = document.FindAllString("パソコン画像", True, True)
index = 0
textRange = None

# 検索結果を繰り返し処理
for selection in selections:
    # 画像を読み込む
    pic = DocPicture(document)
    pic.LoadImage("Laptop.jpg")
    # 見つかったテキストを単一のテキスト範囲として取得
    textRange = selection.GetAsOneRange()
    # テキスト範囲が所属する段落内でのインデックスを取得
    index = textRange.OwnerParagraph.ChildObjects.IndexOf(textRange)
    # インデックス位置に画像を挿入
    textRange.OwnerParagraph.ChildObjects.Insert(index, pic)
    # テキスト範囲を削除
    textRange.OwnerParagraph.ChildObjects.Remove(textRange)

# 処理済みの文書を保存
document.SaveToFile("output/テキストを画像に置換.docx")
document.Close()
```

結果
![Word文書のテキストを検索して画像に置換](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/d1b88904-bb77-462d-97a4-cf64803a1626.png)

---

本記事では、Pythonを使用してWord文書内のテキストを検索および置換する方法について、直接置換、正規表現を使用した置換、さらにテキストを画像に置換する方法を紹介しました。