Исходя из предложенного вами решения, я предполагаю, что мне не нужно хранить ключи в виде списка (я буду использовать набор для ускорения поиска). Этот ответ также предполагает, что все слова в тексте разделены пробелом (который я буду использовать, чтобы соединить их обратно). Дайте это, вы можете использовать:
>>> keys = (["cat", "dog", "mouse"])
>>> text = "Cat dog cat cloud miracle DOG MouSE"
>>> converted = " ".join(("[%s](%s)" % (word, word.lower()) if word.lower() in keys else word) for word in text.split())
>>> converted
'[Cat](cat) [dog](dog) [cat](cat) cloud miracle [DOG](dog) [MouSE](mouse)'
Конечно, это вызывает word.lower () дважды. Вы можете избежать этого (и при этом использовать аналогичный подход), используя два списка (или, собственно, выражения генератора):
>>> converted = " ".join(("[%s](%s)" % (word, lower) if lower in keys else word) for word, lower in ((w, w.lower()) for w in text.split()))
>>> converted
'[Cat](cat) [dog](dog) [cat](cat) cloud miracle [DOG](dog) [MouSE](mouse)'