正则表达式 - 两个字符串之间的匹配排除以避免重叠

Regex - Match between two strings with an exclusion to avoid overlapping

我正在使用 Python 从一些 Pdf 中提取 tables。具体来说,我要删除 tables,它们有可能重叠

有一段时间,格式如下:

TABLE答:

(以 % 结尾的内容)

TABLE乙:

(以 % 结尾的内容)

等等,等等

我会使用这个正则表达式来获取每个 tables 而不会重叠(即抓取第一个 TABLE 和最后一个 % 之间的所有内容):

(TABLE [A-Z]:)(([^%]|\n)*)%

最近,格式发生了变化,现在 table 以一个不同的词(马车)结尾。当我尝试将它添加到我的旧模式时,它不再正常工作,因为我使用的是否定集(并且将整个单词放在这里开始否定单个字母)。我不知道如何取反整个字符串,而且我找到的每个解决方案都无法成功集成到模式的其余部分。

P.S 我知道 Regex 模块有一个允许重叠的 findall,但我目前仅限于 Python 我组织中的标准库。

在您的模式中,您可以将此部分 ([^%]|\n)* 写为 ([^%]*),因为否定字符 class 也将匹配换行符。

但是如果你想使用一个词而不是单个字符,那么使用否定字符 class 是行不通的。

您可以做的是使点匹配换行符并匹配尽可能少的字符,直到遇到 Carriage

(?s)(TABLE [A-Z]:)(.*?)\bCarriage\b

Regex demo