Communitygithub.com

Regex vs LLM pour l'extraction de texte structuré

Cadre de décision pour choisir entre regex et LLM lors du parsing de texte structuré — commencer par regex, n'ajouter LLM que pour les cas limites à faible confiance.

Qu'est-ce que Regex vs LLM pour l'extraction de texte structuré ?

Cette compétence fournit un cadre pratique pour décider entre l'utilisation d'expressions régulières (regex) et d'un grand modèle de langage (LLM) lors de l'extraction de texte structuré (quiz, formulaires, factures, documents). L'idée clé est que les regex traitent de 95 à 98 % des cas de manière économique et déterministe, réservant les appels LLM coûteux aux cas limites restants. Le processus comprend un parseur regex principal, un nettoyeur de texte, un scoreur de confiance (qui identifie les éléments à faible confiance, par exemple en raison d'un nombre insuffisant d'options ou de réponses manquantes), et un validateur LLM facultatif pour ne corriger que ces cas marginaux. La compétence est conçue pour les développeurs créant des pipelines de traitement de texte hybrides, prenant en charge des plateformes comme Claude Code et Cursor, et optimisant à la fois le coût et la précision. Des exemples d'implémentation concrets sont fournis, ainsi que des métriques issues d'un pipeline de production (taux de succès regex de 98 %, économies de coûts d'environ 95 % par rapport à une approche entièrement LLM).

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/ECC/tree/main/skills/regex-vs-llm-structured-text

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Que fait Regex vs LLM pour l'extraction de texte structuré ?

Un cadre de décision pratique pour analyser du texte structuré (quiz, formulaires, factures, documents). L'idée clé : les regex traitent 95 à 98 % des cas de manière économique et déterministe. Réservez les appels LLM coûteux aux cas limites restants.

Quand activer

  • Analyse de texte structuré avec des motifs répétitifs (questions, formulaires, tableaux)
  • Décision entre regex et LLM pour l'extraction de texte
  • Construction de pipelines hybrides combinant les deux approches
  • Optimisation des compromis coût/précision dans le traitement de texte

Cadre de décision

Le format du texte est-il cohérent et répétitif ?
├── Oui (>90 % suit un motif) → Commencer par Regex
│   ├── Regex gère 95%+ → Terminé, pas de LLM nécessaire
│   └── Regex gère <95% → Ajouter LLM uniquement pour les cas limites
└── Non (forme libre, très variable) → Utiliser LLM directement

Architecture du pipeline

Texte source
    │
    ▼
[Parseur Regex] ─── Extrait la structure (précision 95-98%)
    │
    ▼
[Nettoyeur de texte] ─── Supprime le bruit (marqueurs, numéros de page, artefacts)
    │
    ▼
[Scoreur de confiance] ─── Identifie les extractions à faible confiance
    │
    ├── Haute confiance (≥0.95) → Sortie directe
    │
    └── Faible confiance (<0.95) → [Validateur LLM] → Sortie

Implémentation

1. Parseur Regex (gère la majorité)

import re
from dataclasses import dataclass

@dataclass(frozen=True)
class ParsedItem:
    id: str
    text: str
    choices: tuple[str, ...]
    answer: str
    confidence: float = 1.0

def parse_structured_text(content: str) -> list[ParsedItem]:
    """Parse le texte structuré à l'aide de motifs regex."""
    pattern = re.compile(
        r"(?P<id>\d+)\.\s*(?P<text>.+?)\n"
        r"(?P<choices>(?:[A-D]\..+?\n)+)"
        r"Answer:\s*(?P<answer>[A-D])",
        re.MULTILINE | re.DOTALL,
    )
    items = []
    for match in pattern.finditer(content):
        choices = tuple(
            c.strip() for c in re.findall(r"[A-D]\.\s*(.+)", match.group("choices"))
        )
        items.append(ParsedItem(
            id=match.group("id"),
            text=match.group("text").strip(),
            choices=choices,
            answer=match.group("answer"),
        ))
    return items

2. Score de confiance

Identifie les éléments pouvant nécessiter une révision LLM :

@dataclass(frozen=True)
class ConfidenceFlag:
    item_id: str
    score: float
    reasons: tuple[str, ...]

def score_confidence(item: ParsedItem) -> ConfidenceFlag:
    """Score la confiance d'extraction et signale les problèmes."""
    reasons = []
    score = 1.0

    if len(item.choices) < 3:
        reasons.append("few_choices")
        score -= 0.3

    if not item.answer:
        reasons.append("missing_answer")
        score -= 0.5

    if len(item.text) < 10:
        reasons.append("short_text")
        score -= 0.2

    return ConfidenceFlag(
        item_id=item.id,
        score=max(0.0, score),
        reasons=tuple(reasons),
    )

def identify_low_confidence(
    items: list[ParsedItem],
    threshold: float = 0.95,
) -> list[ConfidenceFlag]:
    """Retourne les éléments en dessous du seuil de confiance."""
    flags = [score_confidence(item) for item in items]
    return [f for f in flags if f.score < threshold]

3. Validateur LLM (cas limites uniquement)

def validate_with_llm(
    item: ParsedItem,
    original_text: str,
    client,
) -> ParsedItem:
    """Utilise le LLM pour corriger les extractions à faible confiance."""
    response = client.messages.create(
        model="claude-haiku-4-5-20251001",  # Modèle le moins cher pour la validation
        max_tokens=500,
        messages=[{
            "role": "user",
            "content": (
                f"Extrayez la question, les choix et la réponse de ce texte.\n\n"
                f"Texte : {original_text}\n\n"
                f"Extraction actuelle : {item}\n\n"
                f"Retournez le JSON corrigé si nécessaire, ou 'CORRECT' si exact."
            ),
        }],
    )
    # Analyser la réponse du LLM et retourner l'élément corrigé...
    return corrected_item

4. Pipeline hybride

def process_document(
    content: str,
    *,
    llm_client=None,
    confidence_threshold: float = 0.95,
) -> list[ParsedItem]:
    """Pipeline complet : regex -> vérification de confiance -> LLM pour les cas limites."""
    # Étape 1 : Extraction par regex (gère 95-98%)
    items = parse_structured_text(content)

    # Étape 2 : Score de confiance
    low_confidence = identify_low_confidence(items, confidence_threshold)

    if not low_confidence or llm_client is None:
        return items

    # Étape 3 : Validation LLM (uniquement pour les éléments signalés)
    low_conf_ids = {f.item_id for f in low_confidence}
    result = []
    for item in items:
        if item.id in low_conf_ids:
            result.append(validate_with_llm(item, content, llm_client))
        else:
            result.append(item)

    return result

Métriques réelles

Issues d'un pipeline de parsing de quiz en production (410 éléments) :

MétriqueValeur
Taux de succès regex98,0 %
Éléments à faible confiance8 (2,0 %)
Appels LLM nécessaires~5
Économies par rapport à tout-LLM~95 %
Couverture de test93 %

Meilleures pratiques

  • Commencez par regex — même une regex imparfaite vous donne une base à améliorer
  • Utilisez le score de confiance pour identifier programmatiquement ce qui nécessite l'aide du LLM
  • Utilisez le LLM le moins cher pour la validation (les modèles de classe Haiku sont suffisants)
  • Ne modifiez jamais les éléments analysés — retournez de nouvelles instances depuis les étapes de nettoyage/validation
  • Le TDD fonctionne bien pour les parseurs — écrivez d'abord des tests pour les motifs connus, puis pour les cas limites
  • Journalisez les métriques (taux de succès regex, nombre d'appels LLM) pour surveiller la santé du pipeline

Anti-patrons à éviter

  • Envoyer tout le texte à un LLM alors que regex gère 95 %+ des cas (coûteux et lent)
  • Utiliser regex pour du texte très variable et libre (LLM est meilleur ici)
  • Ignorer le score de confiance et espérer que regex « fonctionne tout seul »
  • Modifier les objets analysés pendant les étapes de nettoyage/validation
  • Ne pas tester les cas limites (entrées mal formées, champs manquants, problèmes d'encodage)

Quand utiliser

  • Analyse de questions d'examen/quiz
  • Extraction de données de formulaires
  • Traitement de factures/reçus
  • Analyse de structure de documents (en-têtes, sections, tableaux)
  • Tout texte structuré avec des motifs répétitifs où le coût est important

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

Skills associés