Это более общий (гибкий и мощный) вариант решения для валидации SSN-номера из раздела Синтаксис. Данное решение задействует регулярные выражения (пакет re для Python), что позволяет проверять более сложные форматы шаблонов, в том числе, с переменной длиной, вариациями разделяющих символов и т.д.

Для разбора взят исходный пример с SSN (переменная ssn), а также более сложный случай с названиями химических элементов из таблицы Менделеева (переменная elem). Идея регулярного выражения для валидации названия химического элемента взята здесь.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
* Encoding: UTF-8.
* Пример данных.
DATA LIST FIXED /ssn 1-11 (A) elem 13-15 (A).
BEGIN DATA
123-45-6789 Ba
1234-5-6789 H
12e-45-6789 Te
123&45-2222 Ht
111-44-2389 Uus
122-33-678  ult
END DATA.
LIST.

BEGIN PROGRAM Python.
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import spss, re
cur = spss.Cursor(accessType='w')
# Создание переменных для хранения найденных ошибок (0 - признак числовой переменной)
cur.SetVarNameAndType(['error_ssn', 'error_elem'], [0,0])
cur.CommitDictionary()
for i in range(spss.GetCaseCount()):
    row = cur.fetchone()
    # 0 - индекс первой переменной, 1 - индекс второй
    ssn =  row[0]
    elem = row[1]
    if not re.match(r'^\d{3}-\d{2}-\d{4}$', ssn):
       cur.SetValueNumeric('error_ssn', 1)
    # Флаг VERBOSE ниже - чтобы можно было разбить рег. выражение на строки 
    # чтобы сохранить понятную структуру
    if not re.match(r"""^A[cglmrstu]\s$|^B[aehikr]?\s*$|^C[adeflmnorsu]?\s*$|
                         ^D[bsy]\s|^E[rsu]\s$|^F[elmr]?\s*$|^G[ade]\s$|
                         ^H[efgos]?\s*$|^I[nr]?\s*$|^Kr?\s*$|^L[airuv]\s$|
                         ^M[dgnot]\s$|^N[abdeiop]?\s*$|^Os?\s*$|^P[abdmortu]?\s*$|
                         ^R[abefghnu]\s$|^S[bcegimnr]?\s*$|^T[abcehilm]\s$|
                         ^U(u[opst])?\s*$|^V\s*$|^W\s*$|^Xe\s$|^Yb?\s*$|^Z[nr]\s$""",
                    elem, re.VERBOSE):  
       cur.SetValueNumeric('error_elem', 1)
    cur.CommitCase()
cur.close()
39
END PROGRAM.