Communitygithub.com

regex-vs-llm-structured-text

解析结构化文本时,在正则表达式和LLM之间做出决策的框架——优先使用正则,仅在低置信度的边缘情况引入LLM。

regex-vs-llm-structured-text 是什么?

该技能提供了一个实用的决策框架,用于解析具有重复模式的结构化文本(如测验、表单、发票和文档)。其核心理念是:正则表达式可以廉价且确定性地处理95-98%的情况,因此建议以正则表达式作为默认方法,仅在剩余边缘情况(低置信度提取)中调用大语言模型(LLM)。技能文档详细描述了从正则解析器、文本清理器、置信度评分器到LLM验证器的完整混合管道架构。实现部分包含了具体的Python代码示例,展示如何构建解析器、计算置信度、使用Haiku类模型进行验证,以及组合完整管道。该技能支持Claude Code、Cursor和Codex等AI Agent平台,其关键价值在于显着降低处理成本:以一道生产线的测验解析管道为例,相比全程使用LLM,该方案可节省约95%的成本,同时保持高精度。技能还涵盖了最佳实践和反模式,例如始终从正则开始、使用最便宜的LLM进行验证、避免对解析对象进行可变操作等。

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

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

正则表达式 vs 大语言模型(LLM)用于结构化文本解析

一个用于解析结构化文本(测验、表单、发票、文档)的实用决策框架。核心见解:正则表达式可以廉价且确定性地处理 95-98% 的情况。将昂贵的 LLM 调用保留给剩余的边缘情况。

何时激活

  • 解析具有重复模式的结构化文本(问题、表单、表格)
  • 在正则表达式和 LLM 之间进行文本提取的决策
  • 构建结合两种方法的混合管道
  • 优化文本处理中的成本/精度权衡

决策框架

文本格式是否一致且重复?
├── 是(>90% 遵循某种模式)→ 从正则表达式开始
│   ├── 正则处理 95% 以上 → 完成,无需 LLM
│   └── 正则处理 <95% → 仅为边缘情况添加 LLM
└── 否(自由格式,高度可变)→ 直接使用 LLM

架构模式

源文本
    │
    ▼
[正则解析器] ─── 提取结构(95-98% 精度)
    │
    ▼
[文本清理器] ─── 移除噪声(标记、页码、人工制品)
    │
    ▼
[置信度评分器] ─── 标记低置信度的提取结果
    │
    ├── 高置信度(≥0.95)→ 直接输出
    │
    └── 低置信度(<0.95)→ [LLM 验证器] → 输出

实现

1. 正则解析器(处理大部分情况)

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]:
    """使用正则表达式模式解析结构化文本。"""
    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. 置信度评分

标记可能需要 LLM 审查的项目:

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

def score_confidence(item: ParsedItem) -> ConfidenceFlag:
    """对提取结果的置信度进行评分并标记问题。"""
    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]:
    """返回置信度低于阈值的项目。"""
    flags = [score_confidence(item) for item in items]
    return [f for f in flags if f.score < threshold]

3. LLM 验证器(仅处理边缘情况)

def validate_with_llm(
    item: ParsedItem,
    original_text: str,
    client,
) -> ParsedItem:
    """使用 LLM 修复低置信度的提取结果。"""
    response = client.messages.create(
        model="claude-haiku-4-5-20251001",  # 用于验证的最便宜模型
        max_tokens=500,
        messages=[{
            "role": "user",
            "content": (
                f"从以下文本中提取问题、选项和答案。\n\n"
                f"文本:{original_text}\n\n"
                f"当前提取结果:{item}\n\n"
                f"如果需要,返回修正后的 JSON,如果准确则返回 'CORRECT'。"
            ),
        }],
    )
    # 解析 LLM 响应并返回修正后的项目...
    return corrected_item

4. 混合管道

def process_document(
    content: str,
    *,
    llm_client=None,
    confidence_threshold: float = 0.95,
) -> list[ParsedItem]:
    """完整管道:正则 -> 置信度检查 -> 为边缘情况调用 LLM。"""
    # 步骤 1:正则提取(处理 95-98%)
    items = parse_structured_text(content)

    # 步骤 2:置信度评分
    low_confidence = identify_low_confidence(items, confidence_threshold)

    if not low_confidence or llm_client is None:
        return items

    # 步骤 3:LLM 验证(仅针对标记的项目)
    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

实际度量

来自一个生产环境的测验解析管道(410 个项目):

度量项值
正则表达式成功率98.0%
低置信度项目8 (2.0%)
需要的 LLM 调用次数~5
与全部使用 LLM 相比的成本节省~95%
测试覆盖率93%

最佳实践

  • 从正则开始 —— 即使是不完美的正则也能为你提供一个改进的基线
  • 使用置信度评分,以编程方式识别哪些部分需要 LLM 帮助
  • 使用最便宜的 LLM 进行验证(Haiku 类模型就足够了)
  • 切勿改变已解析的项目 —— 从清理/验证步骤返回新实例
  • TDD 对解析器很有效 —— 首先为已知模式编写测试,然后处理边缘情况
  • 记录度量(正则成功率、LLM 调用次数)以跟踪管道健康状态

应避免的反模式

  • 当正则能够处理 95% 以上的情况时,仍将所有文本发送给 LLM(昂贵且慢)
  • 对自由格式、高度可变的文本使用正则(这种情况 LLM 更适合)
  • 跳过置信度评分,期望正则“能正常工作”
  • 在清理/验证步骤中改变已解析的对象
  • 不测试边缘情况(格式错误的输入、缺失字段、编码问题)

何时使用

  • 测验/考试题目解析
  • 表单数据提取
  • 发票/收据处理
  • 文档结构解析(标题、章节、表格)
  • 任何具有重复模式且成本重要的结构化文本

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.

相关技能