用于在 multi-line 文本中查找包含句子的段落的正则表达式

Regex to find paragraph that contains a sentence in a multi-line text

我有一个 pdf 提取文本,看起来像这样

========================================

标题

副标题

Lorem Ipsum 只是打印的虚拟文本

和排版行业。 Lorem Ipsum 已

自 1500 年代以来的行业标准虚拟文本。

副标题

Lorem Ipsum 只是打印的虚拟文本并且

排版行业。 Lorem Ipsum 一直是业界的

自 1500 年代以来的标准虚拟文本。

========================================

每行末尾有一个新行('\n')。

我正在尝试使用正则表达式查找给定的句子并提取找到该句子的段落。段落是两个连续换行符 (\n\n) 之间的任何内容。请注意,必须使用惰性方法来完成。

仅供参考:

  1. 句子可以在一行开始,在另一行结束

  2. 我无法更改给定的文本格式

  3. 到return的行数有限制,所以如果我向上或向下10行后找不到\n\n,我必须return 10正则表达式关键字之前和之后的 10 行

像这样的事情可能会让你开始:

import re

data = """
ggg

aaa aaa aaa
more bla...

========================================

TITLE

subtitle

Lorem Ipsum is simply dummy text of the printing

and typesetting industry. Lorem Ipsum has been

the industry's standard dummy text ever since the 1500s.

subtitle

Lorem Ipsum is simply more bla of the printing and

typesetting industry. Lorem Ipsum has been the industry's

standard dummy text ever since the 1500s.

========================================

bla bla bla bla bla
more bla...

yet more bla
"""

if __name__ == "__main__":
    to_search = "more bla"
    print(re.findall(r"(?:(?<!^\n)\n(?!^\n)|[^\n])*"+re.escape(to_search)+r"(?:(?<!^\n)\n(?!^\n)|[^\n])*", data, re.DOTALL|re.MULTILINE|re.IGNORECASE))

重要的是 DOTALL 和 MULTILINE 参数,用于匹配换行符和跨行搜索。以及检测 2 个连续的 \n 字符的前瞻...