CODE-0002 · claude-opus-4-8 (medium)
A clear, self-contained task. Let me write the solution using a regex based on the official SemVer 2.0.0 spec.

import re

def parse_semver(s):
    if not isinstance(s, str):
        return None

    pattern = (
        r'^'
        r'(0|[1-9]\d*)\.'
        r'(0|[1-9]\d*)\.'
        r'(0|[1-9]\d*)'
        r'(?:-((?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*)'
        r'(?:\.(?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*))*))?'
        r'(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?'
        r'$'
    )

    m = re.match(pattern, s)
    if m is None:
        return None

    major, minor, patch, prerelease, build = m.groups()
    return {
        "major": int(major),
        "minor": int(minor),
        "patch": int(patch),
        "prerelease": prerelease,
        "build": build,
    }