Я пытаюсь создать строку регулярного выражения Python для проверки значений столбца, которые представляют собой разделенные запятыми последовательности уникальных трехбуквенных кодов из списка трехбуквенных (прописных) буквенно-цифровых кодов, например.список выглядит примерно так: ['XA1', 'CZZ', 'BT9', 'WFF',...]
.Таким образом, допустимые значения столбца могут быть XA1
, XA1;CZZ
или XA1;BT9;WFF;
и т. Д. Код не может встречаться в последовательности более одного раза.
Допустимые последовательности должны быть непустыми, состоять из уникальных кодов,и может заканчиваться или не заканчиваться ;
, включая случай, когда последовательность содержит только один код.
Если codes
является списком кодов, тогда строка соответствия регулярному выражению, которую я построил из этого, равна
match_str = '?'.join(['({};){}'.format(code, '?' if codes[-1] == code else '') for code in codes])
, который дает мне, используя этот список примеров только с четырьмя кодами выше
'(XA1;)?(CZZ;)?(BT9;)?(WFF;)?'
Запросы на соответствие регулярному выражению создают объекты с ненулевым соответствием для того, что должно быть допустимой последовательностью, например
re.match(match_str, 'XA1;')
re.match(match_str, 'XA1;WFF')
re.match(match_str, 'XA1;')
и т. Д.
In [124]: re.match(match_str, 'anystring')
Out[124]: <_sre.SRE_Match object; span=(0, 0), match=''>
In [125]: re.match(match_str, '')
Out[125]: <_sre.SRE_Match object; span=(0, 0), match=''>
In [126]: re.match(match_str, 'XA1;something')
Out[126]: <_sre.SRE_Match object; span=(0, 4), match='XA1;'>
Я хочу, чтобы результаты всех трех запросов выше были нулевыми, поэтому я могу использовать условное выражение для отфильтровывания недопустимых значений, например
if re.match(match_str, val):
# do something
else:
# do something else