提取多个相似文本块
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
我正在尝试解析报告。以下是我需要解析的文本示例:
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