import re
codes = ['XA1', 'CZZ', 'BT9', 'WFF']
block = "(?:{})".format("|".join(codes))
rex = re.compile( r"^(?!.*\b(\w+)\b.*\b\1\b){0}(?:;{0})*;?$".format(block) )
print(rex)
strs = ['XA1', 'XA1;CZZ', 'XA1;BT9;WFF;', 'XA1;XA1;', 'XA1;something']
for s in strs:
if rex.match(s):
print("{} - Valid!".format(s))
else:
print("{} - Invalid!".format(s))
aW1wb3J0IHJlCmNvZGVzID0gWydYQTEnLCAnQ1paJywgJ0JUOScsICdXRkYnXQpibG9jayA9ICIoPzp7fSkiLmZvcm1hdCgifCIuam9pbihjb2RlcykpCnJleCA9ICByZS5jb21waWxlKCByIl4oPyEuKlxiKFx3KylcYi4qXGJcMVxiKXswfSg/Ojt7MH0pKjs/JCIuZm9ybWF0KGJsb2NrKSApCnByaW50KHJleCkKCnN0cnMgPSBbJ1hBMScsICdYQTE7Q1paJywgJ1hBMTtCVDk7V0ZGOycsICdYQTE7WEExOycsICdYQTE7c29tZXRoaW5nJ10KZm9yIHMgaW4gc3RyczoKICAgIGlmIHJleC5tYXRjaChzKToKICAgICAgICBwcmludCgie30gLSBWYWxpZCEiLmZvcm1hdChzKSkKICAgIGVsc2U6CiAgICAJcHJpbnQoInt9IC0gSW52YWxpZCEiLmZvcm1hdChzKSk=