用于使用多个句子的问题的正则表达式
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)
否定前瞻,断言右边的空白边界
我正在使用 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)
否定前瞻,断言右边的空白边界