Choose regex first, then add LLMs for low-confidence parsing edge cases.
Copy the install command and let the AI configure it · recommended for beginners
Please install the "regex-vs-llm-structured-text" skill from askskill: 1. Download https://raw.githubusercontent.com/affaan-m/ECC/main/skills/regex-vs-llm-structured-text/SKILL.md 2. Save it as ~/.claude/skills/regex-vs-llm-structured-text/SKILL.md 3. Reload skills and tell me it's ready
I need to extract timestamps, error codes, and request IDs from application logs with multiple formats. Give me a decision framework for what should use regex, what low-confidence edge cases should go to an LLM, and how to design a fallback flow.
A parsing strategy that uses regex first and routes low-confidence cases to an LLM.
Help me evaluate this: customer emails mostly follow fixed templates, but sometimes include free-text additions. I want to extract order numbers, shipping dates, and addresses. Explain why regex should be the default and which exceptions justify using an LLM.
A rules-first plan for semi-structured emails plus clear conditions for invoking an LLM.
The text from OCR-processed forms is mostly consistent, but includes misalignment, missing fields, and noise. Propose a structured-text parsing plan: which fields should be cleaned and extracted with regex, when an LLM should do semantic repair, and how to balance quality and cost.
A hybrid OCR form parsing framework with field routing, exception handling, and cost guidance.
A practical decision framework for parsing structured text (quizzes, forms, invoices, documents). The key insight: regex handles 95-98% of cases cheaply and deterministically. Reserve expensive LLM calls for the remaining edge cases.
Is the text format consistent and repeating?
├── Yes (>90% follows a pattern) → Start with Regex
│ ├── Regex handles 95%+ → Done, no LLM needed
│ └── Regex handles <95% → Add LLM for edge cases only
└── No (free-form, highly variable) → Use LLM directly
Source Text
│
▼
[Regex Parser] ─── Extracts structure (95-98% accuracy)
│
▼
[Text Cleaner] ─── Removes noise (markers, page numbers, artifacts)
│
▼
[Confidence Scorer] ─── Flags low-confidence extractions
│
├── High confidence (≥0.95) → Direct output
│
└── Low confidence (<0.95) → [LLM Validator] → Output
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 structured text using regex patterns."""
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
Flag items that may need LLM review:
@dataclass(frozen=True)
class ConfidenceFlag:
item_id: str
score: float
reasons: tuple[str, ...]
def score_confidence(item: ParsedItem) -> ConfidenceFlag:
"""Score extraction confidence and flag issues."""
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]:
"""Return items below confidence threshold."""
flags = [score_confidence(item) for item in items]
return [f for f in flags if f.score < threshold]
def validate_with_llm(
item: ParsedItem,
original_text: str,
client,
) -> ParsedItem:
"""Use LLM to fix low-confidence extractions."""
response = client.messages.create(
model="claude-haiku-4-5-20251001", # Cheapest model for validation
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."
),
}],
)
# Parse LLM response and return corrected item...
return corrected_item
…
Create, configure, and refine Hookify rules and syntax patterns.
Refine retrieved context iteratively to improve subagent understanding and output quality.
Conduct multi-source web research and produce cited, source-attributed reports.
Manage Uncloud clusters for deployment, ingress, scaling, and operations troubleshooting.
Process documents with OCR, conversion, extraction, redaction, signing, and form filling.
Manage carrier portfolios, negotiate freight rates, and evaluate carrier performance.
Parse documents into structured, confidence-scored fields for automated extraction workflows.
Extract structured data from unstructured documents for APIs and ETL workflows.
Generate regex from plain English and verify it with Python re tests.
Convert messy text into strict, trustworthy JSON schemas for agents.
Parse, enrich, chunk, and embed documents into AI-ready structured data.
Extract, validate, and mask PII with regex for safer, efficient processing.