我已经挣扎了两天,终于敢问。

这是我的数据(文件):

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个块(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”;比赛后的街区。

(TSH;(?:.*?\r?\n?)*)+(?<=\nTSH;)


找到4个“ TSH”。但不是全部。

需要帮助 :)
附言将在Python中使用

最佳答案

您可以使用以下模式:

(?s)^TSH;.*?Z01;(?=\nTSH|\nTSV;4)



(?s) re.DOTALL选项。
^TSH;在字符串开头匹配子字符串TSH;
.*?懒惰地匹配任何东西。
Z01;匹配子字符串Z01;
(?=\nTSH|\nTSV;4)TSHTSV;4的正向超前。


您可以实时试用here

在Python中,您可以使用:

print(re.findall(r'^TSH;.*?Z01;(?=\nTSH|\nTSV;4)',mystr,re.DOTALL|re.MULTILINE))

07-28 11:33