提取多个相似文本块

问题描述

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

7605625112 DELIVERED N 1 GORDON CONTRACTORS I SIPLAST INC Freight Priority 2000037933 $216.67 1,131 ROOFING MATERIALS
04/23/2021 02:57 PM K WRISHT N 4 CAPITOL HEIGHTS,MD ARKADELPHIA,AR Prepaid 2000037933 -$124.23 170160-00
04/27/2021 12:41 PM 2 40 20743-3706 71923 $.00 055 $.00
2 WBA HOT $62.00 0
$12.92 $92.44
$167.36
7605625123 DELIVERED N 1 SECHRIST HALL CO SIPLAST INC Freight Priority 2000037919 $476.75 871 PAIL,UN1263,PAINT,3,04/23/2021 02:57 PM S CHAVEZ N 39 HARLINGEN,TX ARKADELPHIA,AR Prepaid 2000037919 -$378.54
04/27/2021 01:09 PM 2 479 78550 71923 $.00 085 $95.35
2 HRL HOT $62.00 21
$13.55 $98.21
$173.76

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

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

如果有人可以向我展示返回两个或更多块所需的更改,我将不胜感激。

解决方法

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

为了修复它,你可以使用这个正则表达式:

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

其中我基本上用 .* 替换了 (.(?!\d{10}\sDELIVERED))*,以便它检查每个字符后面是否跟有 \d{10}\sDELIVERED

观看演示here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...