{"id":"8775f2376d15d1d6","repo":"pydantic/pydantic","slug":"pattern-regex","errorCode":"pattern_regex","errorMessage":"Input should be a valid regular expression","messagePattern":"Input should be a valid regular expression","errorType":"validation","errorClass":"PydanticCustomError","httpStatus":null,"severity":"error","filePath":"pydantic/_internal/_validators.py","lineNumber":175,"sourceCode":"            return input_value\n        else:\n            raise PydanticCustomError('pattern_bytes_type', 'Input should be a bytes pattern')\n    elif isinstance(input_value, bytes):\n        return compile_pattern(input_value)\n    elif isinstance(input_value, str):\n        raise PydanticCustomError('pattern_bytes_type', 'Input should be a bytes pattern')\n    else:\n        raise PydanticCustomError('pattern_type', 'Input should be a valid pattern')\n\n\nPatternType = TypeVar('PatternType', str, bytes)\n\n\ndef compile_pattern(pattern: PatternType) -> re.Pattern[PatternType]:\n    try:\n        return re.compile(pattern)\n    except re.error:\n        raise PydanticCustomError('pattern_regex', 'Input should be a valid regular expression')\n\n\ndef ip_v4_address_validator(input_value: Any, /) -> IPv4Address:\n    if isinstance(input_value, IPv4Address):\n        return input_value\n\n    try:\n        return IPv4Address(input_value)\n    except ValueError:\n        raise PydanticCustomError('ip_v4_address', 'Input is not a valid IPv4 address')\n\n\ndef ip_v6_address_validator(input_value: Any, /) -> IPv6Address:\n    if isinstance(input_value, IPv6Address):\n        return input_value\n\n    try:\n        return IPv6Address(input_value)","sourceCodeStart":157,"sourceCodeEnd":193,"githubUrl":"https://github.com/pydantic/pydantic/blob/2e5f0e2b4218de31709f1cf9c5bc61ea97a68835/pydantic/_internal/_validators.py#L157-L193","documentation":"Raised by compile_pattern (pydantic/_internal/_validators.py:175, code 'pattern_regex') when re.compile() fails on the supplied pattern string/bytes. The re.error is caught and surfaced as a pydantic validation error, indicating the input is syntactically not a valid regular expression.","triggerScenarios":"Any Pattern field (Pattern, Pattern[str], or Pattern[bytes]) validated with a string/bytes containing malformed regex syntax — unclosed brackets `[a-`, unbalanced parentheses `(foo`, invalid quantifiers `*+`, invalid escape sequences in strict mode, or stray meta-characters.","commonSituations":"User-supplied search patterns (search boxes, filter inputs). Regex sourced from config files authored without testing. Escaping mistakes when interpolating dynamic values into a regex (forgetting re.escape). Copy-paste from documentation that mangled special characters. Python regex flavor differences vs PCRE/JS.","solutions":["Test the regex in isolation: `python -c \"import re; re.compile('YOUR_PATTERN')\"` to reproduce the re.error.","Fix the specific syntax error (close brackets/parens, remove invalid quantifiers, escape literals).","When interpolating untrusted/dynamic substrings, wrap them with `re.escape()`.","If the value is meant to be a literal match, use plain str equality/`in` instead of a regex."],"exampleFix":"# before\nclass M(BaseModel):\n    p: Pattern\nM(p='[a-')  # unclosed character class -> pattern_regex\n\n# after\nM(p='[a-z-]')  # valid character class","handlingStrategy":"validation","validationCode":"import re\nfrom typing import Any\n\ndef try_compile(pattern: Any) -> bool:\n    try:\n        re.compile(pattern)\n        return True\n    except (re.error, TypeError):\n        return False","typeGuard":"import re\nfrom typing import Any\n\ndef is_compilable_pattern(value: Any) -> bool:\n    try:\n        re.compile(value)\n        return True\n    except (re.error, TypeError, ValueError):\n        return False","tryCatchPattern":"import re\ntry:\n    re.compile(user_pattern)\nexcept re.error as e:\n    # reject the input with a clear 4xx-style message before model validation\n    raise ValueError(f'invalid regex: {e}') from e","preventionTips":["Test regexes with `re.compile()` in isolation before wiring them into config.","Use `re.escape()` when interpolating untrusted substrings into a pattern.","Prefer plain string matching (`in`, equality) when regex features are not needed.","Add a config-load unit test that compiles every configured pattern."],"tags":["pattern","regex","syntax-error","validation"],"analyzedSha":"2e5f0e2b4218de31709f1cf9c5bc61ea97a68835","analyzedAt":"2026-08-04T19:54:21.281Z","schemaVersion":2}