CODE-0002 · grok-4.5 (low)import re
def parse_semver(s):
if not isinstance(s, str):
return None
pattern = re.compile(
r'^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(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-]+)*))?$'
)
m = pattern.match(s)
if not m:
return None
major, minor, patch, prerelease, build = m.groups()
return {
"major": int(major),
"minor": int(minor),
"patch": int(patch),
"prerelease": prerelease,
"build": build,
}