# Alexandria Vail

# 01/28/2011

# Enloe High School

# Potter

# Contest 2

# Senior 3

 

class Search (object):

 

    def __init__ (self, search, bank):

        self.master_search = search

        self.master_bank = bank

 

    def recursion (self, word, search, i, o, b):

        if o == len(search):

            return i - len(search)

        elif i == len(word):

            return False

        elif word[i] in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] and search[o] == '#':

            if int(word[i]) in range(b[0], b[1]):

                return self.recursion(word, search, i + 1, o + 1, b)

            else:

                return False

        elif word[i] == search[o] or search[o] == '?':

            return self.recursion(word, search, i + 1, o + 1, b)

        return self.recursion(word, search, i + 1, 0, b)

 

    def asterisks (self):

        bank = []

        if self.master_search.count("*") == 2:

            self.master_search = self.master_search[1:len(self.master_search) - 1]

            t_search = "" + self.master_search

            x, y = [0, 0]

            if t_search.find("[") + 1:

                i = t_search.find("[")

                j = t_search.find("]")

                brackets = self.master_search[i:j+1]                

                t_search = t_search[0:i] + "#" + t_search[j + 1:len(t_search)]

                x = int(brackets[1])

                y = int(brackets[3]) + 1               

            for word in self.master_bank:

                match = self.recursion(word, t_search, 0, 0, [x, y])

                if match >= 0:

                    bank.append(word[match:len(t_search) + match])

                else:

                    bank.append("")

            if t_search.find("#") + 1:

                bank = self.brackets(bank)

                self.match(bank, self.master_search)

            for word in bank:

                if word == "":

                    self.master_bank[bank.index(word)] = ""

        else:

            if self.master_search.find("*") == 0:

                self.master_search = self.master_search[1:len(self.master_search)]

                if not (self.master_search.find("[") + 1):

                    for word in self.master_bank:

                        bank.append(word[len(word) - len(self.master_search):len(word)])

                else:

                    t_search = self.master_search

                    while t_search.find("[") + 1:

                        a = self.master_search.find("[")

                        b = self.master_search.find("]")

                        t_search = self.master_search[0:a] + self.master_search[b:len(self.master_search)]

                        for word in self.master_bank:

                            bank.append(word[len(word) - len(t_search):len(word)])

            else:

                self.master_search = self.master_search[0:len(self.master_search) - 1]

                if not (self.master_search.find("[") + 1):

                    for word in self.master_bank:

                        bank.append(word[0:len(self.master_search)])

                else:

                    t_search = self.master_search

                    while t_search.find("[") + 1:

                        a = self.master_search.find("[")

                        b = self.master_search.find("]")

                        t_search = self.master_search[0:a] + self.master_search[b:len(self.master_search)]

                        for word in self.master_bank:

                            bank.append(word[0:len(t_search)])

            if self.master_search.find("[") + 1:

                bank = self.brackets(bank)

        self.match(bank, self.master_search)

 

    def brackets (self, bank):

        i = self.master_search.find("[")

        j = self.master_search.find("]")

        brackets = self.master_search[i:j+1]

        self.master_search = self.master_search[0:i] + "#" + self.master_search[j + 1:len(self.master_search)]

        x = int(brackets[1])

        y = int(brackets[3]) + 1

        for i in range(0, len(bank) - 1):

            try:

                if int(bank[i][self.master_search.index('#')]) not in range(x,y):

                    self.master_bank[i] = ""

                    bank[i] = ""

            except ValueError:

                self.master_bank[i] = ""

                bank[i] = ""

        return bank

 

    def match (self, bank, search):

        for i in range(len(bank)):

            for letter in bank[i]:

                s = search[bank[i].find(letter)]

                if s != "?"  and s != "#" and letter != s:

                    self.master_bank[i] = ""

                    bank[i] = ""

                    break

 

    def interpret (self):

        if self.master_search.find("*") + 1:

            self.asterisks()

        elif self.master_search.find("[") + 1:

            self.master_bank = self.brackets(self.master_bank)

            self.match(self.master_bank, self.master_search)

        else:

            bank = []

            for word in self.master_bank:

                if len(word) == len(self.master_search):

                    bank.append(word)

            self.match(bank, self.master_search)

            self.master_bank = bank

        return self.master_bank

 

def get_input():

    i, s = [], []

    print "INPUT"

    for j in range(6):

        i.append(raw_input(str(j+1) + ". "))

    b = i[0].split(', ')

    for k in range(5):

        s.append(i[k+1].strip())

    return b, s

 

def output(i, bank):

    s = ""

    if bank != []:

        for word in bank:

            if word != "":

                s += word + " "

    if s.strip() == "":

        s = "No Match"

    s = str(i) + ". " + s

    print s

 

i_bank, i_searches = get_input()

print "\nOUTPUT"

for i in range(5):

    t = []

    for item in i_bank:

        t.append(item)

    output(i + 1, Search(i_searches[i], t).interpret())