import re
 
class Trie():
    """Regex::Trie in Python. Creates a Trie out of a list of words. The trie can be exported to a Regex pattern.
    The corresponding Regex should match much faster than a simple Regex union."""
 
    def __init__(self):
        self.data = {}
 
    def add(self, word):
        ref = self.data
        for char in word:
            ref[char] = char in ref and ref[char] or {}
            ref = ref[char]
        ref[''] = 1
 
    def dump(self):
        return self.data
 
    def quote(self, char):
        return re.escape(char)
 
    def _pattern(self, pData):
        data = pData
        if "" in data and len(data.keys()) == 1:
            return None
 
        alt = []
        cc = []
        q = 0
        for char in sorted(data.keys()):
            if isinstance(data[char], dict):
                try:
                    recurse = self._pattern(data[char])
                    alt.append(self.quote(char) + recurse)
                except:
                    cc.append(self.quote(char))
            else:
                q = 1
        cconly = not len(alt) > 0
 
        if len(cc) > 0:
            if len(cc) == 1:
                alt.append(cc[0])
            else:
                alt.append('[' + ''.join(cc) + ']')
 
        if len(alt) == 1:
            result = alt[0]
        else:
            result = "(?:" + "|".join(alt) + ")"
 
        if q:
            if cconly:
                result += "?"
            else:
                result = "(?:%s)?" % result
        return result
 
    def pattern(self):
        return self._pattern(self.dump())
 
 
text = r'FIND ANY MATCHING WORD BY THIS VERY LONG REGEX PATTERN FIGHT FIGHTER PARROT PARROT_ING'
keywords = ['FIND', 'ANY', 'MATCHING', 'WORD', 'BY', 'THIS', 'VERY', 'LONG', 'REGEX', 'PATTERN', 'PARROT', 'FIGHT']
trie = Trie()
for word in keywords:
    trie.add(word)
pattern = fr'(?<![^\W_])({trie.pattern()})(?![^\W_])'
print(re.findall(pattern, text))
				aW1wb3J0IHJlCgpjbGFzcyBUcmllKCk6CiAgICAiIiJSZWdleDo6VHJpZSBpbiBQeXRob24uIENyZWF0ZXMgYSBUcmllIG91dCBvZiBhIGxpc3Qgb2Ygd29yZHMuIFRoZSB0cmllIGNhbiBiZSBleHBvcnRlZCB0byBhIFJlZ2V4IHBhdHRlcm4uCiAgICBUaGUgY29ycmVzcG9uZGluZyBSZWdleCBzaG91bGQgbWF0Y2ggbXVjaCBmYXN0ZXIgdGhhbiBhIHNpbXBsZSBSZWdleCB1bmlvbi4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5kYXRhID0ge30KCiAgICBkZWYgYWRkKHNlbGYsIHdvcmQpOgogICAgICAgIHJlZiA9IHNlbGYuZGF0YQogICAgICAgIGZvciBjaGFyIGluIHdvcmQ6CiAgICAgICAgICAgIHJlZltjaGFyXSA9IGNoYXIgaW4gcmVmIGFuZCByZWZbY2hhcl0gb3Ige30KICAgICAgICAgICAgcmVmID0gcmVmW2NoYXJdCiAgICAgICAgcmVmWycnXSA9IDEKCiAgICBkZWYgZHVtcChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5kYXRhCgogICAgZGVmIHF1b3RlKHNlbGYsIGNoYXIpOgogICAgICAgIHJldHVybiByZS5lc2NhcGUoY2hhcikKCiAgICBkZWYgX3BhdHRlcm4oc2VsZiwgcERhdGEpOgogICAgICAgIGRhdGEgPSBwRGF0YQogICAgICAgIGlmICIiIGluIGRhdGEgYW5kIGxlbihkYXRhLmtleXMoKSkgPT0gMToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgYWx0ID0gW10KICAgICAgICBjYyA9IFtdCiAgICAgICAgcSA9IDAKICAgICAgICBmb3IgY2hhciBpbiBzb3J0ZWQoZGF0YS5rZXlzKCkpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGFbY2hhcl0sIGRpY3QpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHJlY3Vyc2UgPSBzZWxmLl9wYXR0ZXJuKGRhdGFbY2hhcl0pCiAgICAgICAgICAgICAgICAgICAgYWx0LmFwcGVuZChzZWxmLnF1b3RlKGNoYXIpICsgcmVjdXJzZSkKICAgICAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgICAgICBjYy5hcHBlbmQoc2VsZi5xdW90ZShjaGFyKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHEgPSAxCiAgICAgICAgY2Nvbmx5ID0gbm90IGxlbihhbHQpID4gMAoKICAgICAgICBpZiBsZW4oY2MpID4gMDoKICAgICAgICAgICAgaWYgbGVuKGNjKSA9PSAxOgogICAgICAgICAgICAgICAgYWx0LmFwcGVuZChjY1swXSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFsdC5hcHBlbmQoJ1snICsgJycuam9pbihjYykgKyAnXScpCgogICAgICAgIGlmIGxlbihhbHQpID09IDE6CiAgICAgICAgICAgIHJlc3VsdCA9IGFsdFswXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9ICIoPzoiICsgInwiLmpvaW4oYWx0KSArICIpIgoKICAgICAgICBpZiBxOgogICAgICAgICAgICBpZiBjY29ubHk6CiAgICAgICAgICAgICAgICByZXN1bHQgKz0gIj8iCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXN1bHQgPSAiKD86JXMpPyIgJSByZXN1bHQKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHBhdHRlcm4oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3BhdHRlcm4oc2VsZi5kdW1wKCkpCgoKdGV4dCA9IHInRklORCBBTlkgTUFUQ0hJTkcgV09SRCBCWSBUSElTIFZFUlkgTE9ORyBSRUdFWCBQQVRURVJOIEZJR0hUIEZJR0hURVIgUEFSUk9UIFBBUlJPVF9JTkcnCmtleXdvcmRzID0gWydGSU5EJywgJ0FOWScsICdNQVRDSElORycsICdXT1JEJywgJ0JZJywgJ1RISVMnLCAnVkVSWScsICdMT05HJywgJ1JFR0VYJywgJ1BBVFRFUk4nLCAnUEFSUk9UJywgJ0ZJR0hUJ10KdHJpZSA9IFRyaWUoKQpmb3Igd29yZCBpbiBrZXl3b3JkczoKICAgIHRyaWUuYWRkKHdvcmQpCnBhdHRlcm4gPSBmcicoPzwhW15cV19dKSh7dHJpZS5wYXR0ZXJuKCl9KSg/IVteXFdfXSknCnByaW50KHJlLmZpbmRhbGwocGF0dGVybiwgdGV4dCkp
				
				
				
				
				
			 
			
				
			
			
				
	
		
		
	
	
		['FIND', 'ANY', 'MATCHING', 'WORD', 'BY', 'THIS', 'VERY', 'LONG', 'REGEX', 'PATTERN', 'FIGHT', 'PARROT', 'PARROT']