python, re.search / re.split для фраз, которые выглядят как заголовок, т.е. начинаются с заглавных букв

У меня есть список фраз (введенных пользователем), я хотел бы найти их в текстовом файле, например:

    titles = ['Blue Team', 'Final Match', 'Best Player',] 
    text = 'In today Final match, The Best player is Joe from the Blue Team and the second best player is Jack from the Red team.'

1. / Я могу найти все вхождения этих фраз примерно так

    titre = re.compile(r'(?P<title>%s)' % '|'.join(titles), re.M)
    list = [ t for t in titre.split(text) if titre.search(t) ]

(Для простоты я предполагаю идеальный интервал.)

2. / Я также могу найти варианты этих фраз, например "Синяя команда", финальный матч "," Лучший игрок "... используя re.I, если они когда-либо появляются в тексте.

Но я хочу ограничиться поиском только вариантов входных фраз с их первой буквой в верхнем регистре, например "Синяя команда" в тексте, независимо от того, как они были введены в качестве ввода, например, "синий тИАМ".

Можно ли написать что-то, чтобы "заблокировать" флаг re.I для части фразы? В псевдокоде я создаю что-то вроде '[B]lue Team|[F]inal Match'.

Примечание. Моей основной целью является, например, не вычисление частоты вводимых фраз в тексте, а извлечение и анализ фрагментов текста между ними или вокруг них.

3 ответа

Я хотел бы использовать re.I и измените список-комп для:

l = [ t for t in titre.split(text) if titre.search(t) and t[0].isupper() ]

Я думаю, что регулярные выражения не позволят вам указать только регион, где применяется флаг игнорирования регистра. Однако вы можете сгенерировать новую версию текста, в которой все символы были в нижнем регистре, но первая для каждого слова:

new_text = ' '.join([word[0] + word[1:].lower() for word in text.split()])

Таким образом, регулярное выражение без флага игнорирования будет совпадать, учитывая регистр только для первого символа каждого слова.

Как насчет изменения входных данных, чтобы они были в правильном регистре, прежде чем использовать их в регулярном выражении?

Другие вопросы по тегам