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

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

    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 ]

1 голос
/ 23 февраля 2012

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

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

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

1 голос
/ 23 февраля 2012

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

l = [ t for t in titre.split(text) if titre.search(t) and t[0].isupper() ]
0 голосов
/ 23 февраля 2012

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

...