0

我正在使用它来查找文本中的句子:

sentences = re.findall("[A-Z].*?[\.!?;]", stripped_value, re.MULTILINE | re.DOTALL | re.UNICODE )

有没有办法同时排除句子边界(逗号、点、问号等)?(我的意思是不对每个字符使用剥离命令)。

4

2 回答 2

2

使用捕获组:

sentences = re.findall(r'([A-Z].*?)[.!?;]', stripped_value, re.MULTILINE | re.DOTALL | re.UNICODE)

.findall()如果表达式中存在一个,则返回捕获组的内容而不是整个匹配项。

演示:

>>> stripped_value = '''Some sentence. And another.
... Multiline text works too! And commas, they are included; but not the semicolon?
... '''
>>> import re
>>> re.findall(r'([A-Z].*?)[.!?;]', stripped_value, re.MULTILINE | re.DOTALL | re.UNICODE)
['Some sentence', 'And another', 'Multiline text works too', 'And commas, they are included']

re.findall()文档中:

如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。

或者,您也可以使用前瞻断言:

sentences = re.findall("[A-Z].*?(?=[\.!?;])", stripped_value, re.MULTILINE | re.DOTALL | re.UNICODE)

积极的(?=..)前瞻断言充当锚;仅当标点符号跟随匹配的文本时,模式才匹配。前瞻可以为您提供更快的结果,因为.findall()不必提取匹配的组。任一替代方案的输出在其他方面是相同的。

于 2013-05-09T10:57:37.257 回答
1

您可以使用捕获组

regex = "([A-Z].*?)[\.!?;]"

...您是否在搜索,为每个匹配项获取一个匹配对象...。

sentence = match_obj.groups(1)

我还注意到您坚持所有句子都以大写字母开头,但您在第一个分号处终止它们。我会说“句子”通常意味着“全部”;连接的分隔子句”。但是如果你想要';' 作为分隔符,那么我会将每个子句都算作一个句子(因为它是,除了大写字母)。

于 2013-05-09T10:58:37.170 回答