我纠结了两天,终于敢问了。
这是我的数据(文件):
EXH;2;20180514103023+00;
TSH;FI__REPLACEMGA_LOS_92_12345;1;1;HOUR;kWh;24;201805120000+00;201805130000+00;LOS_92_12345;;;;;;LOS_92_12345;;;
TSV;1;201805120000+00;0.000000;Z01;
TSV;2;201805120100+00;0.000000;Z01;
TSV;3;201805120200+00;0.000000;Z01;
TSH;FI__REPLACEMGA_LOS_93_12345;1;1;HOUR;kWh;24;201805120000+00;201805130000+00;LOS_93_12345;;;;;;LOS_93_12345;;;
TSV;1;201805120000+00;0.000000;Z01;
TSV;2;201805120100+00;0.000000;Z01;
TSV;3;201805120200+00;0.000000;Z01;
TSV;4;201805120300+00;0.000000;Z01;
TSH;FI__REPLACEMGA_LOS_96_12345;1;1;HOUR;kWh;24;201805120000+00;201805130000+00;LOS_96_12345;;;;;;LOS_96_12345;;;
TSV;1;201805120000+00;0.000000;Z01;
TSV;2;201805120100+00;0.000000;Z01;
TSV;3;201805120200+00;0.000000;Z01;
TSV;4;201805120300+00;0.000000;Z01;
TSH;FI__REPLACEMGA_LOS_97_12345;1;1;HOUR;kWh;24;201805120000+00;201805130000+00;LOS_97_12345;;;;;;LOS_97_12345;;;
TSV;1;201805120000+00;0.000000;Z01;
TSV;2;201805120100+00;0.000000;Z01;
TSV;3;201805120200+00;0.000000;Z01;
TSV;4;201805120300+00;0.000000;Z01;
EXT;
我想从正则表达式中获取 4 个 block (4 个匹配项),例如:
TSH;FI__REPLACEMGA_LOS_92_12345;1;1;HOUR;kWh;24;201805120000+00;201805130000+00;LOS_92_12345;;;;;;LOS_92_12345;;;
TSV;1;201805120000+00;0.000000;Z01;
TSV;2;201805120100+00;0.000000;Z01;
TSV;3;201805120200+00;0.000000;Z01;
在每场比赛中,我都会应用一些进一步的正则表达式。但目前,我无法创建正则表达式来返回这些匹配项。
这是我尝试过的:
(TSH;FI(?:.*?\r?\n?)*(?<=TSH;))+
但是这个仅返回 2 个匹配项(每秒),可能是因为它消耗了每个“TSH;”比赛结束后的区 block 。
(TSH;(?:.*?\r?\n?)*)+(?<=\nTSH;)
这个发现了 4 个“TSH;”但不是完整的 block 。
需要帮助:) 附:将在Python中使用
最佳答案
您可以使用以下模式:
(?s)^TSH;.*?Z01;(?=\nTSH|\nTSV;4)
(?s)
re.DOTALL
选项。^TSH;
匹配字符串开头的子字符串TSH;
。.*?
延迟匹配任何内容。Z01;
匹配子字符串Z01;
。(?=\nTSH|\nTSV;4)
。TSH
或TSV;4
的正向前瞻。
您可以现场尝试 here .
在Python中你可以使用:
print(re.findall(r'^TSH;.*?Z01;(?=\nTSH|\nTSV;4)',mystr,re.DOTALL|re.MULTILINE))
关于python - 需要 REGEX 帮助返回关键字之间的多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51856781/