我已经挣扎了两天,终于敢问。
这是我的数据(文件):
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)
。 TSH
或TSV;4
的正向超前。您可以实时试用here。
在Python中,您可以使用:
print(re.findall(r'^TSH;.*?Z01;(?=\nTSH|\nTSV;4)',mystr,re.DOTALL|re.MULTILINE))