Skip to content

结构化文本解析时,Everything Claude Code 的 Regex vs LLM Skill 主张“能用正则就用正则”,仅将低置信度的极少数边界情况交给 LLM 处理。这一决策框架结合正则的高效确定性和 LLM 的灵活性,实现了 95% 以上场景的低成本自动化解析,同时用信心评分机制保障准确率。适用于问卷、表单、发票等重复结构文本,极大优化了 AI 辅助编程的成本与稳定性。

Everything Claude Code Regex vs LLM Skill:解析结构化文本时选正则还是 LLM 的决策框架

在 AI 编程助手(如 Claude Code、Codex、Cursor)日常开发中,结构化文本解析是高频需求——无论是批量导入问卷、自动抽取表单、还是处理发票、合同、报告等文档结构。传统做法常陷入“全靠正则”或“一股脑丢给 LLM”两极,要么维护复杂的正则表达式,要么为每条数据付出高昂的 LLM 费用。

Everything Claude Code 的 regex-vs-llm-structured-text Skill,正是为了解决这一两难困境:它提供了一个实用的决策框架,让你能用极低的成本和高可控性,批量解析结构化文本,同时只在必要时用 LLM 补足极少数边界情况。该 Skill 已在生产环境大量实践,适配问卷、表格、发票、文档等场景,极大提升了 AI 辅助编程的性价比和稳定性。

本文将结合实际代码与流程,手把手教你如何用好这一 Skill,并介绍其与 Skills/Agents/Hooks/Rules 体系 的协作关系。


1. 这个 Skill 解决什么问题?

  • 高效批量解析结构化文本:如选择题、表单、发票、合同等,格式大体一致但偶有异常。
  • 成本与准确率兼顾:正则可覆盖 95% 以上的标准情况,LLM 仅处理边界异常,节省 95% 以上 LLM 调用成本。
  • 自动识别异常数据:通过置信度评分,自动筛选出正则难以处理或结果可疑的条目,避免“漏网之鱼”。
  • 易于集成与扩展:可作为独立 Skill 嵌入各类 Agent、Pipeline、自动化 Hook,实现端到端自动化。

不用它时的常见问题

  • 纯正则:对异常格式、缺字段、换行等情况无能为力,维护成本高,容易“静默失败”。
  • 纯 LLM:每条都调用 LLM,成本高、速度慢、可重复性差,且易受 prompt 变化影响。
  • 无信心评分:无法自动发现解析失败或异常数据,后续流程易出错。

2. 什么时候激活?(触发条件)

  • 需要批量解析结构化、重复模式的文本(如问卷、表单、发票、合同、表格等)
  • 希望在保证准确率的同时最大化节省 LLM 成本
  • 需要自动标记和处理解析置信度低的异常情况
  • 构建混合解析 Pipeline(正则+LLM),提升整体健壮性

常见 Agent/Skill 配套场景包括:


3. 使用流程 Step by Step

Step 1:用正则批量解析主流结构

假设你要解析如下选择题文本:

1. What is the capital of France?
A. Berlin
B. Madrid
C. Paris
D. Rome
Answer: C

2. Which planet is known as the Red Planet?
A. Earth
B. Mars
C. Jupiter
D. Venus
Answer: B

编写正则解析器:

python
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

Step 2:置信度评分,自动标记异常

对每个解析结果进行信心评分,自动识别“选项数不足”“答案缺失”“题干过短”等问题:

python
@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):
    flags = [score_confidence(item) for item in items]
    return [f for f in flags if f.score < threshold]

Step 3:仅对低置信度条目调用 LLM 修正

对被标记为低置信度的条目,自动调用 LLM(如 Claude Haiku)做二次抽取或修正:

python
def validate_with_llm(item: ParsedItem, original_text: str, client) -> ParsedItem:
    response = client.messages.create(
        model="claude-haiku-4-5-20251001",
        max_tokens=500,
        messages=[{
            "role": "user",
            "content": (
                f"Extract the question, choices, and answer from this text.\n\n"
                f"Text: {original_text}\n\n"
                f"Current extraction: {item}\n\n"
                f"Return corrected JSON if needed, or 'CORRECT' if accurate."
            ),
        }],
    )
    # 解析 LLM 返回,返回修正后的 ParsedItem
    return corrected_item

Step 4:完整混合管道(自动化)

组合以上步骤,形成自动化 Pipeline:

python
def process_document(content: str, *, llm_client=None, confidence_threshold: float = 0.95):
    items = parse_structured_text(content)
    low_confidence = identify_low_confidence(items, confidence_threshold)

    if not low_confidence or llm_client is None:
        return items

    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

输出示例

假设 100 道题,正则成功解析 98 道,仅 2 道因格式异常被标记低置信度并自动交给 LLM 修正。最终输出全部结构化对象,且日志记录正则成功率、LLM 调用次数等指标。


4. 常见配套 Agent 和 Skill 协作关系

  • 可作为 Doc Updater AgentRepo Scan Skill 的结构化抽取核心组件
  • Verification Loop Skill 配合,自动检测和修复解析失败的边界情况
  • 可与 Hooks 体系集成,实现解析后自动触发校验、补全、日志等自动化操作
  • 支持与 Rules 体系结合,按不同文档类型自动切换正则模板和信心评分规则

5. 实践经验与最佳实践

  • 优先用正则,哪怕不完美,也能给后续 LLM 校正提供良好起点
  • 信心评分必不可少,避免“静默失败”或漏掉异常数据
  • LLM 只用最便宜的模型(如 Claude Haiku),仅对极少数异常条目补漏
  • 所有清洗/校正都不应直接修改原对象,始终返回新实例,便于追踪和回溯
  • 测试驱动开发(TDD)效果极佳,先覆盖常规模式,再补充边界用例
  • 日志和指标必备,如正则命中率、LLM 调用次数、异常原因分布,便于持续优化

6. 反模式与注意事项

  • 切忌全部丢给 LLM:正则能搞定 95%+,全用 LLM 既浪费钱又慢
  • 切忌用正则处理自由文本:格式极不规则时,LLM 才是更优解
  • 切忌跳过信心评分:否则异常数据难以被发现和修正
  • 切忌在清洗/校正时原地修改对象:易引入副作用和难以追踪的 bug
  • 切忌不测边界用例:如字段缺失、异常编码、换行错位等

FAQ

Q: 这个 Skill 适合什么类型的文本解析?
A: 主要适合格式高度重复、结构化的文本,如问卷、表单、发票、合同、表格等,尤其在大批量处理和成本敏感场景下效果最佳。

Q: 如果文档格式极度不规则,还能用这个 Skill 吗?
A: 格式高度自由时,建议直接用 LLM 解析,不建议用正则;Skill 内置决策框架会自动切换策略。

Q: 能和 Claude Code 的其他 Agent/Skill 混用吗?
A: 完全可以,推荐与 Doc Updater、Repo Scan、Verification Loop 等 Agent/Skill 及 Hooks、Rules 体系协作,构建端到端自动化处理流。