Как извлечь предложение о допросе из строки

У меня есть веревочка. Например :

«Это строка. Это вопрос? В чем вопрос? Я не знаю, в чем вопрос. Не могли бы вы перечислить вопрос?» Я хочу извлечь вопросы из этого текста с помощью регулярного выражения

что я пробовал

re.findall(r'(how|can|what|where|describe|who|when)(.*?)\s*\?',message,re.I|re.M))

Но он выдает и другие вещи, и если я задаю вопросы, он разделяет (как, что, и т. Д.) И остальную часть вопроса

Для приведенного выше примера мой результат

[('is', ' is a string.Is this a question'), ('What', ' is the Question'), ('what', ' the question is. Can you please list out the question')]

Где, как я хочу, чтобы весь вопрос был воедино.


person Ashish Cherian    schedule 01.07.2016    source источник
comment
Почему бы просто не проверить сообщения, заканчивающиеся на?   -  person Fredrik    schedule 01.07.2016
comment
@Fredrik Я только что обновил вопрос, пожалуйста, проверьте его   -  person Ashish Cherian    schedule 01.07.2016
comment
Вы ищете что-то вроде this (at regex101)?   -  person SamWhan    schedule 01.07.2016
comment
Чтобы задать вопрос целиком, вы должны просто заключить весь шаблон в круглые скобки. Вот еще одна версия: \b([A-Z][^.!]*[?])   -  person Maria Ivanova    schedule 01.07.2016
comment
@ Фредрик, спасибо. Это решает проблему   -  person Ashish Cherian    schedule 01.07.2016


Ответы (3)


Совершенно непрактично искать ключевые слова при определении того, является ли предложение вопросом. Учитывая ваш список: how|can|what|where|describe|who|when, я могу легко написать предложения, содержащие одно из этих слов, которые не являются вопросами!

Есть много способов найти совпадение в предложении. Например, взяв за основу это:

^\s*[A-Za-z,;'"\s]+[.?!]$

Сначала мы могли бы изменить его так, чтобы оно соответствовало нескольким предложениям в одной строке:

(^|(?<=[.?!]))\s*[A-Za-z,;'"\s]+[.?!]

При этом используется просмотр назад, чтобы убедиться, что предложение только что закончилось (если только мы не re в начале строки).

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

(^|(?<=[.?!]))\s*[A-Za-z,;'"\s]+\?

Вот онлайн-демонстрация моего регулярного выражения на вашей исходной строке.

person Tom Lord    schedule 01.07.2016
comment
regex101.com/r/rT1mQ0/4 - person Ashish Cherian; 01.07.2016
comment
Вопросительное слово или вопросительное слово - это функциональное слово, используемое для задания вопроса, например, что, когда, где, кто, кого, почему и как. Иногда их называют wh-словами, потому что в английском языке большинство из них начинается с wh- (сравните Five Ws). Их можно использовать как в прямых вопросах (Куда он идет?), Так и в косвенных (интересно, куда он идет). В английском и других языках одни и те же формы используются как относительные местоимения в определенных относительных придаточных предложениях (Страна, где он родился) и некоторых наречиях (Я иду туда, куда он идет). - person Ashish Cherian; 01.07.2016
comment
en.wikipedia.org/wiki/Interrogative_word - person Ashish Cherian; 01.07.2016
comment
@AshishCherian Я хочу сказать, что регулярное выражение нельзя надежно использовать для сопоставления с такими словами. например: Когда я голоден, я ем. Я сказал правильно. Единственный надежный индикатор вопроса - это завершающий символ ?. - person Tom Lord; 01.07.2016
comment
Есть разные способы расширить это, но я не хотел чрезмерно усложнять его для ваших нужд. Например, вы можете включить закрывающие скобки в символы конца предложения: (^|(?<=[.?!)]))\s*[A-Za-z,;'"\s]+\? - regex101.com/ r / rT1mQ0 / 5 - person Tom Lord; 01.07.2016
comment
Кроме того, вы, возможно, можете написать вопросы без символа ?, например Скажите мне наш name. - Если вы хотите также включить их, то регулярное выражение не является жизнеспособным вариантом. - person Tom Lord; 01.07.2016
comment
спасибо. Ваш код работает нормально, но, похоже, он не может справиться с такой строкой ['Categories\\t\\t\se time - HTTP compression\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\tHow to troubleshoot sudden CPU spikes?'] - person Ashish Cherian; 01.07.2016
comment
Хорошо, так что вы можете настроить его дальше, указав начало предложения, которое также будет добавлено после табуляции: (^|(?<=[.?!)\t]))\s*[A-Za-z,;'"\s]+\?. И, возможно, вы также захотите включить дефисы в разрешенный список символов предложения: (^|(?<=[.?!)\t]))\s*[A-Za-z,;'"\s-]+\?. Не принимайте это как абсолютный, окончательный ответ; поиграйте с ним в соответствии со своими потребностями. - person Tom Lord; 01.07.2016

Чтобы задать вопрос целиком, вы должны просто заключить весь шаблон в круглые скобки.

Вот еще одна упрощенная версия:

\b([A-Z][^.!]*[?])
person Maria Ivanova    schedule 01.07.2016
comment
Я получаю следующий результат после добавления () к (как | может | что | где | описать | кто | когда) (. *?) \ S * \? - person Ashish Cherian; 01.07.2016
comment
[('is это строка. Это вопрос?', 'is', 'это строка. Это вопрос'), ('What is the Question?', 'What', 'is the Question') , ("в чем вопрос. Не могли бы вы перечислить вопрос?", "что", "вопрос в том. Не могли бы вы перечислить вопрос")] - person Ashish Cherian; 01.07.2016
comment
\ b ([A-Z] [^.!] * [?]) эта скороговорка работает, только если первая буква - заглавные! Вы также можете добавить a-z. - person Deca; 01.07.2016
comment
@Deca, это правда, но я предполагаю, что предложение всегда будет начинаться с заглавной буквы. - person Maria Ivanova; 01.07.2016
comment
@AshishCherian, вам не нужно добавлять (how|can|what|where|describe|who|when)(.*?)\s*\? . Вы можете просто использовать шаблон как есть. Он захватил бы любое предложение, начиная с заглавной буквы и заканчивая вопросительным знаком. Таким образом, вам не нужно знать, с какого слова оно начинается. - person Maria Ivanova; 01.07.2016
comment
Спасибо, ребята, но это решает проблему: \ s * ([^.?] * (?: как | можно | что | где | это | описать | кто | когда) [^.?] *? \ S * \? ) - person Ashish Cherian; 01.07.2016

Спасибо за помощь, ответ был предоставлен @Fredrik, его можно найти здесь https://regex101.com/r/rT1mQ0/2

\s*([^.?]*(?:how|can|what|where|describe|who|when)[^.?]*?\s*\?)
person Ashish Cherian    schedule 01.07.2016
comment
Почему предложение Is this a question? не считается вопросом? - person Tom Lord; 01.07.2016