19_regex.py 738 B

123456789101112131415161718192021222324252627
  1. #!/usr/bin/env python3
  2. import regex
  3. import sys
  4. def parse(f):
  5. rules = {}
  6. for line in f:
  7. if line == '\n':
  8. break
  9. ident, rule = line.rstrip().split(': ')
  10. rules[int(ident)] = rule.replace('"', '')
  11. return rules, f.read().splitlines()
  12. def match(rules, messages):
  13. def expand(word):
  14. return group(int(word)) if word.isdigit() else word
  15. def group(ident):
  16. return '(?:' + ''.join(map(expand, rules[ident].split())) + ')'
  17. reg = regex.compile(group(0))
  18. return sum(reg.fullmatch(m) is not None for m in messages)
  19. rules, messages = parse(sys.stdin)
  20. print(match(rules, messages))
  21. rules[8] = '42 +'
  22. rules[11] = '(?P<group> 42 (?&group)? 31 )'
  23. print(match(rules, messages))