提取多个相似文本块

Extracting Multiple Blocks of Similar Text

我正在尝试解析报告。以下是我需要解析的文本示例:

7605625112 DELIVERED N 1 GORDON CONTRACTORS I SIPLAST INC Freight Priority 2000037933 6.67 1,131 ROOFING MATERIALS
04/23/2021 02:57 PM K WRISHT N 4 CAPITOL HEIGHTS, MD ARKADELPHIA, AR Prepaid 2000037933 -4.23 170160-00
04/27/2021 12:41 PM 2 40 20743-3706 71923 $.00 055 $.00
2 WBA HOT .00 0
.92 .44
7.36
7605625123 DELIVERED N 1 SECHRIST HALL CO SIPLAST INC Freight Priority 2000037919 6.75 871 PAIL,UN1263,PAINT,3,
04/23/2021 02:57 PM S CHAVEZ N 39 HARLINGEN, TX ARKADELPHIA, AR Prepaid 2000037919 -8.54
04/27/2021 01:09 PM 2 479 78550 71923 $.00 085 .35
2 HRL HOT .00 21
.55 .21
3.76

这由两个或多个以 "[0-9]{10}\sDELIVERED" 开头的块和下一个块之前的最后一个货币字符串组成。

如果我使用 "(?s)([0-9]{10}\sDELIVERED)(.*)(?<=$167.36\n)" 进行测试,我会成功获得第一个块,但是如果我使用 "(?s)([0-9]{10}\sDELIVERED)(.*)(?<=$\d\d\d.\d\d\n)",它会抓取所有内容。

如果有人能告诉我需要对 return 两个或更多块进行的更改,我将不胜感激。

* 是一个贪心运算符,所以它会尝试匹配尽可能多的字符。另见 Repetition with Star and Plus

要修复它,您可以使用此正则表达式:

(?s)(\d{10}\sDELIVERED)((.(?!\d{10}\sDELIVERED))*)(?<=$\d\d\d.\d\d)

其中我基本上用 (.(?!\d{10}\sDELIVERED))* 替换了 .* 这样对于每个字符它都会检查它后面是否有 \d{10}\sDELIVERED.

观看演示 ​​here