Spaces:
Running
Running
from typing import List, Dict, Optional | |
import re | |
import weave | |
from pydantic import BaseModel | |
class RegexResult(BaseModel): | |
passed: bool | |
matched_patterns: Dict[str, List[str]] | |
failed_patterns: List[str] | |
class RegexModel(weave.Model): | |
patterns: Dict[str, str] | |
def __init__(self, patterns: Dict[str, str]) -> None: | |
""" | |
Initialize RegexModel with a dictionary of patterns. | |
Args: | |
patterns: Dictionary where key is pattern name and value is regex pattern | |
Example: {"email": r"[^@ \t\r\n]+@[^@ \t\r\n]+\.[^@ \t\r\n]+", | |
"phone": r"\b\d{3}[-.]?\d{3}[-.]?\d{4}\b"} | |
""" | |
super().__init__(patterns=patterns) | |
self._compiled_patterns = { | |
name: re.compile(pattern) for name, pattern in patterns.items() | |
} | |
def check(self, text: str) -> RegexResult: | |
""" | |
Check text against all patterns and return detailed results. | |
Args: | |
text: Input text to check against patterns | |
Returns: | |
RegexResult containing pass/fail status and details about matches | |
""" | |
matches: Dict[str, List[str]] = {} | |
failed_patterns: List[str] = [] | |
for pattern_name, compiled_pattern in self._compiled_patterns.items(): | |
found_matches = compiled_pattern.findall(text) | |
if found_matches: | |
matches[pattern_name] = found_matches | |
else: | |
failed_patterns.append(pattern_name) | |
# Consider it passed only if no patterns matched (no PII found) | |
passed = len(matches) == 0 | |
return RegexResult( | |
passed=passed, | |
matched_patterns=matches, | |
failed_patterns=failed_patterns | |
) | |
def predict(self, text: str) -> RegexResult: | |
""" | |
Alias for check() to maintain consistency with other models. | |
""" | |
return self.check(text) |