Если вам не нужно использовать регулярные выражения, это будет сделано более эффективно с помощью оператора IN и простого понимания цикла или списка:
mainWord = "launcher"
words = ["launch","launcher"]
matches = [ word for word in words if word in mainWord ]
# case insensitive...
matchWord = mainWord.lower()
matches = [ word for word in words if word.lower() in matchWord ]
Даже если вам требуется регулярное выражение, циклбыло бы необходимо, потому что re.findAll () никогда не соответствует перекрывающимся шаблонам:
import re
pattern = re.compile("launcher|launch")
mainWord = "launcher"
matches = []
startPos = 0
lastMatch = None
while startPos < len(mainWord):
if lastMatch : match = pattern.match(mainWord,lastMatch.start(),lastMatch.end()-1)
else : match = pattern.match(mainWord,startPos)
if not match:
if not lastMatch : break
startPos = lastMatch.start() + 1
lastMatch = None
continue
matches.append(mainWord[match.start():match.end()])
lastMatch = match
print(matches)
обратите внимание, что даже в этом цикле вам нужно, чтобы более длинные слова появлялись перед более короткими, если вы используете |оператор в регулярном выражении.Это потому что |никогда не будет жадным и будет соответствовать первому, а не самому длинному слову.