Python, regex查找子句,排除边界



我用这个来查找文本中的句子:

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

是否有一种方法可以同时排除句子边界(逗号,点,问号等)?(我的意思是不使用每个字符的条带命令)。

使用捕获组:

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()不需要提取匹配的组。在其他情况下,这两个选项的输出都是相同的。

您可以使用捕获组

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

…您是否正在搜索,获取每个匹配的匹配对象....

sentence = match_obj.groups(1)

我还注意到你坚持所有的句子都以大写字母开头,但你以第一个分号结束。我想说的是,"句子"通常指的是"所有","分开的子句连接"。但是,如果您希望';'作为分隔符,那么我会将每个子句算作一个句子(因为它是,除了大写字母)。

最新更新