我有一个字符串。例如:
"这是一个字符串。这是一个问题吗?问题是什么?我不知道问题是什么。你能列出一个问题吗?" 我想使用正则表达式从本文中提取问题
我尝试了什么
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')]
我想把整个问题放在一起。
答案 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*\?)