Eu acho que isso deve ser suficiente:
#!python
import re
pattern = re.compile(r'<title>([^<]*)</title>', re.MULTILINE|re.IGNORECASE)
pattern.search(text)
... assumindo que seu texto (HTML) esteja em uma variável chamada "texto".
Isso também pressupõe que não há outras tags HTML que possam ser legalmente incorporadas dentro de uma tag HTML TITLE e que não há maneira de incorporar legalmente qualquer outro caractere <dentro desse contêiner / bloco.
No entanto ...
Não use expressões regulares para análise de HTML no Python. Use um analisador de HTML! (A menos que você escreva um analisador completo, o que seria um trabalho extra quando vários analisadores de HTML, SGML e XML já estiverem nas bibliotecas padrão.
Se você manipular o HTML de sopa de tags do "mundo real" (que geralmente não está em conformidade com qualquer validador SGML / XML), use o pacote BeautifulSoup . Ainda não está nas bibliotecas padrão, mas é amplamente recomendado para esse fim.
Outra opção é: lxml ... que é escrito para HTML adequadamente estruturado (conforme os padrões). Mas tem uma opção para usar o BeautifulSoup como um analisador: ElementSoup .