如何从字符串中提取询问句

时间:2016-07-01 09:21:15

标签: python regex string regex-greedy

我有一个字符串。例如:

"这是一个字符串。这是一个问题吗?问题是什么?我不知道问题是什么。你能列出一个问题吗?" 我想使用正则表达式从本文中提取问题

我尝试了什么

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')]

我想把整个问题放在一起。

3 个答案:

答案 0 :(得分:0)

要将整个问题放在一起,您应该将整个模式括在括号中。

这是另一个简化版本:

\b([A-Z][^.!]*[?])

答案 1 :(得分:0)

在确定句子是否是一个问题时,搜索关键词是完全不切实际的。鉴于您的列表:how|can|what|where|describe|who|when,我 可以 轻松编写包含其中一个单词的句子,这些单词不是问题!

有很多方法可以解决匹配句子的问题。例如,以this为基准:

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

我们可以先改变它以匹配同一个字符串中的多个句子:

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

这使用look-behind来确保句子刚刚完成(除非我们在字符串的开头)。

然后将其调整为仅匹配以?结尾的句子:

(^|(?<=[.?!]))\s*[A-Za-z,;'"\s]+\?
我的正则表达式的{p> Here is an online demo,原始字符串。

答案 2 :(得分:0)

感谢您帮助我 答案由@Fredrik提供 并且可以在https://regex101.com/r/rT1mQ0/2

找到
\s*([^.?]*(?:how|can|what|where|describe|who|when)[^.?]*?\s*\?)