用于使用多个句子的问题的正则表达式

Regex for questions taking multiple sentences

我正在使用 re 从课文中提取问题。我只想要带问题的句子,但在问题之前也有多个句子。我的代码如下所示:

match = re.findall("[A-Z].*\?", data2)
print(match)

我得到的结果示例是:

 'He knows me, and I know him. Do YOU know me? Hey?'

两个问题要分开,非疑问句不要有。感谢您的帮助。

您可以查找以 '?' 结尾的字母、数字和空格。

>>> [i.strip() for i in re.findall('[\w\d\s]+\?', s)]
['Do YOU know me?', 'Hey?']

仍然会有一些边缘情况需要处理,比如可能有标点符号 ',' 或其他复杂情况。

您应该在表达式的开头使用 ^,这样您的正则表达式应该如下所示:"^[A-Z].*\?".

“匹配字符串的开头,如果启用了多行标志 (m),则匹配行的开头。这匹配的是位置,而不是字符。”

如果您的行中有多个句子,您可以使用以下正则表达式:

"(?<=.\s+)[A-Z].*\?"

?<= 称为正后视。我们试图找到以新行开头或前面有一个句点 (.) 和一个或多个空白字符的句子。

正则表达式中的 . 字符匹配您不想包含的任何文本,包括句点。为什么不简单地匹配句子结尾标点符号以外的任何内容?

questions = re.findall(r"\s*([^\.\?]+\?)", data2)
# \s*       sentence beginning space to ignore
# (         start capture group
# [^\.\?]+  negated capture group matching anything besides "." and "?" (one or more)
# \?        question mark to end sentence
# )         end capture group

您可以使用

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

模式匹配:

  • (?<!\S) 否定向后看,断言左边的空白边界
  • [A-Z] 匹配单个大写字符 A-Z
  • [^?.]*\? 匹配 0+ 次除 ?. 之外的任何字符,然后匹配 ?
  • (?!\S) 否定前瞻,断言右边的空白边界

Regex demo