Валидация формата содержимого строковой переменной
Это более общий (гибкий и мощный) вариант решения для валидации 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.
|
Related pages
...