import re pps = [d.strip() for d in open("4.dat").read().split("\n\n")] req = [ ("byr:", "19[2-9][0-9]|200[0-2](\s|$)"), ("iyr:", "201[0-9]|2020(\s|$)"), ("eyr:", "202[0-9]|2030(\s|$)"), ("hgt:", "(1[5-8][0-9]|19[0-3]cm)|(59|6[0-9]|7[0-6]in)(\s|$)"), ("hcl:", "#[a-f0-9]{6}(\s|$)"), ("ecl:", "amb|blu|brn|gry|grn|hzl|oth(\s|$)"), ("pid:", "\d{9}(\s|$)"), ] def all_fields_present(pp): for fld, _ in req: if not fld in pp: return False return True def check_field_rules(pp): for fld, rexp in req: if not re.search(fld + rexp, pp): return False return True valid_a, valid_b = 0, 0 for pp in pps: if all_fields_present(pp): valid_a += 1 valid_b += check_field_rules(pp) print("a", valid_a, "b", valid_b)