--- /dev/null
+#!/usr/bin/python3
+
+import sys
+import re
+
+filename="p1_2.txt"
+if len(sys.argv) > 1:
+ filename=sys.argv[1]
+
+in_rules=True
+rules={}
+data=[]
+
+for line in open(filename, "r"):
+ line = line.rstrip()
+ if line == "":
+ in_rules=False
+ continue
+
+ if in_rules:
+ (rule_number,rule) = line.split(":")
+ rule_number=int(rule_number)
+ rule=rule.strip()
+ rules[rule_number] = [s.strip() for s in rule.split("|")]
+ else:
+ data.append(line)
+
+def get_rule_regex(rulenumber):
+ regex=""
+ first=False
+ for rule in rules[rulenumber]:
+ if rule[0] != '"':
+ # not a character, so we're going to go down the wishing well
+ for number in rule.split(" "):
+ number=int(number)
+ regex+=get_rule_regex(number)
+ regex+="|"
+ else:
+ regex+=rule[1:-1]
+ if regex[-1] == "|":
+ regex=regex[0:-1]
+ regex="("+regex+")"
+
+ return regex
+
+# ok - so all the rules are in, lets build a huge regex that gets all the rules
+for rule_number in rules:
+ print(str(rule_number) + ": " + "| ".join(rules[rule_number]))
+
+pattern="^"+get_rule_regex(0)+"$"
+
+match_count=0
+
+for line in data:
+ if re.search(pattern, line):
+ print("Line: {} matches".format(line))
+ match_count+=1
+
+print("There were {} matches in total".format(match_count))