正则表达式 - 两个字符串之间的匹配排除以避免重叠
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
我正在使用 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