請求書の解析に正規表現(regex)を使うのをやめよう:AIで明細を数秒で抽出

Dev.to / 2026/5/4

💬 オピニオンDeveloper Stack & InfrastructureTools & Practical UsageModels & Research

要点

  • 請求書やレシートの解析を正規表現(regex)で行うと、ベンダーごとに形式が異なったりOCRのノイズが混ざったりするため、壊れやすいと説明しています。
  • 請求書には日付形式や用語のばらつき、明細行を含む表データが非構造のテキストとして届くなど、そもそも予測しにくい要素が多いと述べています。
  • パターンに合わせて手作業で処理するのではなく、生の請求書テキストをLLM搭載の抽出APIに渡し、常に同一のJSONスキーマで結果を返してもらう手法を提案しています。
  • ガイドでは、RapidAPIの「Invoice and Receipt Extractor」エンドポイントをPythonから呼び出して、1リクエストで明細を構造化抽出する手順を示します。

請求書解析の悪夢

請求書やレシートから構造化データを抽出しようとしたことがあるなら、そのつらさをまさに理解しているはずです。

あるベンダーの「合計金額」を抽出するために、完璧な正規表現を書きます。うまく動いて、素晴らしい結果になります。ところが、新しいベンダーが少し異なる形式でやって来ると、あなたの正規表現は静かに失敗し、パイプラインを壊し、ぐちゃぐちゃになったデータの後片付けに追われることになります。

請求書は本質的に予測不可能です。そこには次のようなものが含まれます:

  • 日付形式がさまざま(DD/MM/YYYYMM/DD/YYYY)。
  • 表形式のデータが、生の非構造テキストとして表現されている。
  • 用語のばらつき(「Qty」「Units」「Quantity」など)。
  • OCR(光学文字認識)スキャナが生成する混沌としたテキスト。

これを従来のコードで解析しようとするのは、終わりのない『モグラたたき』ゲームのようなものです。

このガイドでは、ずっと良い方法を紹介します。それは、専門のAI抽出APIを使って、厄介な請求書テキストを1回のリクエストでクリーンな構造化JSONに変換することです。

解決策:AIによる抽出

テキスト座標や正規表現でパターンを合わせにいくのではなく、現代のワークフローでは非構造化テキストをそのまま、LLMベースのAPIに渡します。AIはドキュメントの文脈を理解し、取引先(マーチャント)を特定し、明細行(line items)を切り出し、毎回同一の統一JSONスキーマを返します。

では、Pythonで実装する方法を見ていきましょう。

前提条件

手順を進めるには、次のものが必要です:

  1. お使いのマシンにPythonをインストールしていること。
  2. requests ライブラリ(pip install requests)。
  3. RapidAPI上の「Invoice and Receipt Extractor API」の無料APIキー。

ステップバイステップの実装

OCRスキャナ、または、ぐちゃぐちゃなPDFの請求書から生のテキストを抽出したスクリプトがあると仮定します。次が、その非構造化テキストの例です:

Coast View Investments.ltd
N0 PARTICULARS QTTY UNITS UNIT PRICE COST
1 POLES 150 PIECES 50 7500
TOTAL. 7500

では、このデータをAPIに送って自動的に解析するPythonスクリプトを書いてみましょう。

Pythonコード

extract.py というファイルを作成し、以下のコードを追加してください:

import json
import requests

# 1. APIエンドポイントとRapidAPIの認証情報を定義する
url = "https://invoice-and-receipt-extractor.p.rapidapi.com/v1/extract"

headers = {
    "Content-Type": "application/json",
    "x-rapidapi-key": "YOUR_RAPIDAPI_KEY",  # 実際のRapidAPIキーに置き換えてください
    "x-rapidapi-host": "invoice-and-receipt-extractor.p.rapidapi.com"
}

# 2. 解析したい生の請求書テキストを追加する
payload = {
    "text_content": "Coast View Investments.ltd
N0 PARTICULARS QTTY UNITS UNIT PRICE COST
1 POLES 150 PIECES 50 7500
TOTAL. 7500"
}

print("⏳ AIでデータを抽出しています...")

# 3. APIリクエストを送信する
try:
    response = requests.post(url, json=payload, headers=headers)
    response.raise_for_status()

    # 4. クリーンなJSON出力を表示する
    structured_data = response.json()
    print("
✅ 成功!クリーンな構造化データを受け取りました:
")
    print(json.dumps(structured_data, indent=2))

except requests.exceptions.HTTPError as err:
    print(f"❌ APIエラー: {err}")

結果

スクリプトを実行すると、APIがごちゃごちゃのテキストを処理し、データをクリーンで非常に信頼性の高い形式に抽出します:

返却形式: {"translated": "翻訳されたHTML"}
{
  "merchant_name": "Coast View Investments.ltd",
  "date_of_issue": null,
  "invoice_number": null,
  "line_items": [
    {
      "description": "POLES",
      "quantity": 150.0,
      "unit_price": 50.0,
      "total_price": 7500.0
    }
  ],
  "subtotal": 7500.0,
  "tax_amount": 0.0,
  "currency": "USD",
  "grand_total": 7500.0
}

これで、数十もの独自パースルールを書かなくても、こうした整ったJSON出力をそのまま会計ソフト、データベース、またはERPに直接マッピングできます。

結論:難しく考えず、もっと賢くやろう

2026年になって、正規表現の周りに脆いデータパイプラインを構築するのはもう理にかなっていません。専用のAI抽出APIを活用すれば、開発にかかる時間を何時間も節約でき、取引先がドキュメントのレイアウトを更新しても壊れないパイプラインを構築できます。

自分でも試してみたい場合:

  • RapidAPIのInvoice and Receipt Extractor APIをチェックしてみてください。
  • 無料プラン(リクエスト/月10件)に登録して、今日から自分のプロジェクトでテストを始めましょう。