29 lines
647 B
Python
29 lines
647 B
Python
import re
|
|
|
|
ORCID_REGEX = re.compile(r"^\d{4}-\d{4}-\d{4}-\d{3}[0-9X]$")
|
|
|
|
|
|
def is_valid_orcid(orcid_id: str) -> bool:
|
|
"""
|
|
Valida un ORCID ID:
|
|
- Formato: 0000-0000-0000-0000
|
|
- Dígito de control según ISO 7064 Mod 11-2
|
|
"""
|
|
if not ORCID_REGEX.match(orcid_id):
|
|
return False
|
|
|
|
# Quitar guiones
|
|
digits = orcid_id.replace("-", "")
|
|
|
|
total = 0
|
|
# Los primeros 15 dígitos
|
|
for char in digits[:-1]:
|
|
total = (total + int(char)) * 2
|
|
|
|
# Resto
|
|
remainder = total % 11
|
|
result = (12 - remainder) % 11
|
|
check_digit = "X" if result == 10 else str(result)
|
|
|
|
return digits[-1] == check_digit
|